Как добавить пользовательские утверждения пользователей в JWT и принципале пользователя при использовании Microsoft.AspNetCore.ApiAuthorization.IdentityServer - PullRequest
0 голосов
/ 08 ноября 2019

Я использую новый шаблон React, который является частью выпуска .NET Core 3. Этот шаблон использует Microsoft.AspNetCore.ApiAuthorization.IdentityServer для интеграции ASP.NET Core Identity, IdentityServer и React для регистрации, аутентификации и авторизации пользователей.

Это действительно хорошо работает для простых сценариев, но я нахожу документацию для немного более сложных сценариевзапутанный. Это происходит главным образом потому, что сейчас существует много разных винтиков, и трудно понять, где искать.

Я хочу сделать следующее: я хочу добавить пользовательское утверждение для пользователя (скажем,, IsAdmin: true). Эта заявка должна быть доступна в .NET Core HttpContext в ApiController (как часть принципала заявки пользователя) для целей аутентификации, и это должно быть где-то, где React может прочитать эту заявку (это, вероятно, будет identitytoken / jwt), чтобыобеспечить хороший пользовательский опыт.

Какой хороший способ сделать это?

Ответы [ 2 ]

1 голос
/ 11 ноября 2019

Вы можете использовать IProfileService для добавления пользовательских утверждений в токен JWT:

public class MyProfileService : IProfileService
{
    public MyProfileService()
    { }

    public Task GetProfileDataAsync(ProfileDataRequestContext context)
    {

        var claims = new List<Claim>()
        {

            new Claim(ClaimTypes.Role, "Admin")
        };
        context.IssuedClaims.AddRange(claims);
        return Task.CompletedTask;
    }

    public Task IsActiveAsync(IsActiveContext context)
    {
        // await base.IsActiveAsync(context);
        return Task.CompletedTask;
    }
}

Обеспокоенность по поводу длины идентификатора токена, по умолчанию заявки не будут включены в идентификатор токена, вместо этого он получитпретензии от конечной точки userinfo OIDC. Вы можете:

  1. Получить заявки от user.profile в шаблоне React, он автоматически отправит запрос конечной точке userinfo с токеном id.

  2. Или вы можете установить для AlwaysIncludeUserClaimsInIdToken значение true в параметрах клиента при регистрации клиента в Identity Server 4, но, боюсь, вам не нужно использовать сервис ApiAuthorization, полную мощностьIdentityServer по-прежнему доступен для настройки аутентификации в соответствии с вашими потребностями.

1 голос
/ 08 ноября 2019

Я думаю, вы должны проверить ApiResource конфигурацию. Какие бы утверждения вы ни добавляли в UserClaims свойство ApiResource конфигурации, эти утверждения будут отображаться в токене доступа. например,

 public IEnumerable<ApiResource> GetApiResources()
 {
      return new List<ApiResource>
      {
            new ApiResource("api1")
            {
                UserClaims = new[] { "CustomClaim1", "CustomClaim2"},
            }, 
       }
 }

В приведенном выше коде код доступа будет содержать CustomClaim1 и CustomClaim2 . Следовательно, если вы не упомянете их, они не появятся в маркере доступа. Надеюсь, это поможет!

...