Asp.Net Core 3 Identity - Пользовательские утверждения, отсутствующие в JWT из браузера - PullRequest
0 голосов
/ 11 октября 2019

Asp.Net Core 3.0
Я использую шаблон ASP.NET Core web application with Angular and Authentication (отдельные учетные записи пользователей) (из Visual Studio 2019).
Я намерен добавить несколько пользовательских утверждений всгенерировал JWT и использовал их в браузере.
Для этого я расширил UserClaimsPrincipalFactory

public class MyCustomClaimsInjector : UserClaimsPrincipalFactory<ApplicationUser>
{
    public MyCustomClaimsFactory(UserManager<ApplicationUser> userManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, optionsAccessor)
    {
    }

    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var id = await base.GenerateClaimsAsync(user);
        id.AddClaim(new Claim("my_claim1", "AdditionalClaim1"));
        id.AddClaim(new Claim("my_claim2", "AdditionalClaim2"));
        return id;
    }
}

Также я зарегистрировал расширение в Startup.cs

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddDbContext<ApplicationDbContext>(options => options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

        services.AddDefaultIdentity<ApplicationUser>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddClaimsPrincipalFactory<MyCustomClaimsFactory>();


        services.AddIdentityServer()
            .AddApiAuthorization<ApplicationUser, ApplicationDbContext>();

        services.AddAuthentication()
            .AddIdentityServerJwt();
        services.AddControllersWithViews();
        services.AddRazorPages();
        // In production, the Angular files will be served from this directory
        services.AddSpaStaticFiles(configuration =>
        {
            configuration.RootPath = "ClientApp/dist";
        });
    }

На этапе входа в систему, запущенном с клиента SPA, отладчик проходит через MyCustomClaimsFactory и добавляет утверждения к ClaimsIdentity в методе GenerateClaimsAsync.

Но я нахожу странным, почему JWT, полученный в браузере, не содержит утверждений, добавленных MyCustomClaimsFactory.

Оправдано ли мое ожидание увидеть пользовательскую заявку в JWT в браузере?

Может кто-нибудь подсказать направление, в котором нужно копаться ... Почему претензий нет в JWT?

Расшифровывается JWT: enter image description here

Приложение SPA: enter image description here

1 Ответ

2 голосов
/ 17 октября 2019

поделюсь моими результатами. Надеюсь, это кому-нибудь еще поможет.

Я реализовал IProfileService и передал реализацию .AddProfileService<ProfileService>() в ConfigureServices.

public class ProfileService : IProfileService
{
    protected UserManager<ApplicationUser> _userManager;

    public ProfileService(UserManager<ApplicationUser> userManager)
    {
        _userManager = userManager;
    }

    public async Task GetProfileDataAsync(ProfileDataRequestContext context)
    {         
        var user = await _userManager.GetUserAsync(context.Subject);

        var claims = new List<Claim>
        {
            new Claim("my_FirstName", "user_FirstName"),
            new Claim("my_LastName", "user_LastName")
        };

        context.IssuedClaims.AddRange(claims);
    }

    public async Task IsActiveAsync(IsActiveContext context)
    {            
        var user = await _userManager.GetUserAsync(context.Subject);

        context.IsActive = (user != null);
    }
}

в файле Startup.cs

services.AddIdentityServer()
        .AddApiAuthorization<ApplicationUser, ApplicationDbContext>()
        .AddProfileService<ProfileService>();

С учетом этого теперь JWT содержит мои пользовательские утверждения .
Я не уверен, почему переопределение для UserClaimsPrincipalFactory не смогло решить эту проблему.
Попробую изучить глубжеэти области.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...