4

Я работаю над приложением MVC asp.net с сервером идентификации 4 в качестве службы токенов. У меня тоже есть api, у которого есть некоторые защищенные ресурсы. Я хочу реализовать роли (авторизация) для api. Я хочу убедиться, что только авторизованный ресурс с действительной ролью может получить доступ к конечной точке api, в противном случае получить 401 (несанкционированная ошибка).реализация ролей на сервере идентификации 4 с идентификатором asp.net

Вот мои конфигурации:

Клиентские

  new Client() 
      { 
       ClientId = "mvcClient", 
       ClientName = "MVC Client",      
       AllowedGrantTypes = GrantTypes.HybridAndClientCredentials, 

       ClientSecrets = new List<Secret>() 
       { 
        new Secret("secret".Sha256()) 
       }, 

       RequireConsent = false; 

       // where to redirect to after login 
       RedirectUris = { "http://localhost:5002/signin-oidc" }, 
       // where to redirect to after logout 
       PostLogoutRedirectUris = { "http://localhost:5002" }, 

       AllowedScopes = 
       { 
        StandardScopes.OpenId.Name, 
        StandardScopes.Profile.Name, 
        StandardScopes.OfflineAccess.Name, 
        StandardScopes.Roles.Name, 
        "API" 
       } 
      } 

Прицелы

return new List<Scope>() 
      { 
       StandardScopes.OpenId, // subject id 
       StandardScopes.Profile, // first name, last name 
       StandardScopes.OfflineAccess, // requesting refresh tokens for long lived API access 
       StandardScopes.Roles, 
       new Scope() 
       { 
        Name = "API", 
        Description = "API desc", 
        Type = ScopeType.Resource, 
        Emphasize = true, 
        IncludeAllClaimsForUser = true, 
        Claims = new List<ScopeClaim> 
        { 
         new ScopeClaim(ClaimTypes.Name),  
         new ScopeClaim(ClaimTypes.Role) 
        } 
       } 
      }; 

Пользователь

new InMemoryUser() 
       { 
        Subject = "1", 
        Username = "testuser", 
        Password = "password", 
        Claims = new List<Claim>() 
        { 
         new Claim("name", "Alice"), 
         new Claim("Website", "http://alice.com"), 
         new Claim(JwtClaimTypes.Role, "admin") 

        } 
       } 

и в запуске сервера я прибавил:

services.AddIdentityServer() .AddTemporarySigningCredential() .AddSigningCredential (серт) .AddInMemoryClients (Config.GetClients()) .AddInMemoryScopes (Config.GetScopes()) .AddInMemoryUsers (Config.GetUsers())

в запуске апи, у меня есть это:

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions() 
      { 
       Authority = "http://localhost:5000", 
       ScopeName = "NamfusAPI", 
       RequireHttpsMetadata = false 
      }); 

в контроллере апи, у меня есть это:

[Authorize(Roles = "admin")] 
     public IActionResult Get() 
     { 
      return new JsonResult(from c in User.Claims select new {c.Type, c.Value }); 
     } 

в запуске клиента MVC, у меня есть это:

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear(); 

app.UseCookieAuthentication(new CookieAuthenticationOptions() 
      { 
       AuthenticationScheme = "Cookies" 
      }); 


      var oidcOptions = new OpenIdConnectOptions() 
      { 
       AuthenticationScheme = "oidc", 
       SignInScheme = "Cookies", 

       Authority = "http://localhost:5000", 
       RequireHttpsMetadata = false, 

       ClientId = "mvcClient", 
       ClientSecret = "secret", 
       SaveTokens = true, 
       GetClaimsFromUserInfoEndpoint = true, 
       ResponseType = "code id_token", // hybrid flow 

      }; 


      oidcOptions.Scope.Clear(); 
      oidcOptions.Scope.Add("openid"); 
      oidcOptions.Scope.Add("profile"); 
      oidcOptions.Scope.Add("NamfusAPI"); 
      oidcOptions.Scope.Add("offline_access"); 
      oidcOptions.Scope.Add("roles"); 

Я пытаюсь вызвать апи так:

public async Task<IActionResult> CallApiUsingUserAccessToken() 
     { 
      var accessToken = await HttpContext.Authentication.GetTokenAsync("access_token"); 

      var client = new HttpClient(); 
      client.SetBearerToken(accessToken); 
      var content = await client.GetStringAsync("http://localhost:5001/identity"); 

      ViewBag.Json = JArray.Parse(content).ToString(); 
      return View("json"); 
     } 

Я получаю токен доступа, но когда вы вызываете api (identity/get), я получаю ошибку 302 Forbidden (в хромовой сети она показывает 500 внутренних ошибок сервера). Если изменить API атрибут Авторизовать из

[Authorize(Roles = "admin")] 
      public IActionResult Get() 

к (без роли):

[Authorize] 
     public IActionResult Get() 

это работает, и я получаю данные из API в приложении MVC. Как я могу применять роли в этом коде.

Просьба предложить.

+0

уверен, что вы не должны делать как 'AddTemporarySigningCredential()' и 'AddSigningCredential (CERT)'? –

ответ

2

Во-первых, вам нужно запросить область API в вашем OpenIdConnectOptions().

oidcOptions.Scope.Add("API"); 

или

Scope = { "API", "offline_access",..}, 

Затем вам нужно проверить, если требование роли включен в список требований, доступных вашему API контроллера (не применяются роли фильтра в атрибуте авторизовать еще. Помещенный отлаживать точку внутри контроллера и расширить свойство пользователя).Проверьте, если тип роли утверждают, что вы получили (перечисленные в пунктах сбора) соответствует User.Identity.RoleClaimType свойство

enter image description here

Если тип роли претензии у вас есть и User.Identity.RoleClaimType не совпадают, авторизовать атрибут с ролями фильтра не будет Работа. Вы можете установить в IdentityServerAuthenticationOptions правильный RoleClaimType() нравится следующим

app.UseIdentityServerAuthentication(new IdentityServerAuthenticationOptions 
     { 
      Authority = "http://localhost:5000", 
      ScopeName = "API", 
      RoleClaimType = ClaimTypes.Role, 
      RequireHttpsMetadata = false 
     }); 
+0

Спасибо за ответ. Я вижу RoleClaimType не доступно, когда я пытаюсь RoleClaimType = ClaimTypes.Role, в MVC клиента, как это 'code'var oidcOptions = новых OpenIdConnectOptions() { AuthenticationScheme = "РСИН", SignInScheme = "Cookies", Authority = "HTTP: // локальный: 5000", RequireHttpsMetadata = ложь, GetClaimsFromUserInfoEndpoint = истина, RoleClaimType = ClaimTypes.Role, }; 'code' –

+0

Это должно быть добавлено в Api. Для IdentityServerAuthenticationOptions – rawel

+0

я вижу, что свойство User.Claims в контроллере равно null, где, поскольку значение RoleCalimtype в идентификаторе имеет такое же значение, как показано выше. –

 Смежные вопросы

  • Нет связанных вопросов^_^