Добавление заявок в asp net core 3.0 и доступ к ним с помощью встроенного сервера идентификации - PullRequest
0 голосов
/ 25 октября 2019

В настоящее время мне не удается обернуть голову вокруг претензий. У меня есть проект ASP.Net Core 3 с угловым шаблоном и пользователями, хранящимися в приложении.

Я хочу добавить претензии своим пользователям, читая, я думал, что это будет легко, просто добавьте что-то вроде

await _UserManager.AddClaimAsync(user, new Claim(AccountStatic.ClaimTypes._Claim_Id, user.Id));

Когда вы создаете пользователя, а затем получаетевернитесь с помощью строки ниже, как только они снова войдут в систему:

User.FindFirst(AccountStatic.ClaimTypes._Claim_Id)?.Value;

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

Нужно ли где-то определять, какие из утверждений пользователей включаются при входе в систему?

Редактировать. Я нашел сообщение о том, что мне нужно добавлять утверждения с помощью DI AddClaimsPrincipalFactory. Поэтому я добавил этот класс.

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

    //https://levelup.gitconnected.com/add-extra-user-claims-in-asp-net-core-web-applications-1f28c98c9ec6
    protected override async Task<ClaimsIdentity> GenerateClaimsAsync(ApplicationUser user)
    {
        var identity = await base.GenerateClaimsAsync(user);
        identity.AddClaim(new Claim(AccountStatic.ClaimTypes.Claim_Id, user.Id ?? "[no id]"));
        return identity;
    }
}

И если я перешагну через код, то увижу, что здесь добавляются претензии. Но в контроллере мои пользовательские претензии отсутствуют.

internal string GetUserId()
{
    if (User.Identity.IsAuthenticated == false)
        return null;

    return User.FindFirst(AccountStatic.ClaimTypes.Claim_Id)?.Value;
}

Обновление. Хорошо, я нахожу это очень странным. Я пытался сделать то, что другие утверждают, что работа, но для меня ничто не дает мне имя пользователя или идентификатор. осматривая User я получаю следующее. Ничто здесь не содержит ссылки на вошедшего в систему пользователя.

enter image description here

Обновление 2: Только что заметил, что там на самом деле есть Id: {http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier: ed107a11-6c62-496b-901e-ed9e6497662a} Кажется, это идентификатор пользователяиз базы данных. Пока не уверен, как получить к нему доступ.

Они возвращают ноль.

User.FindFirst(JwtRegisteredClaimNames.NameId)?.Value;
User.FindFirst("nameidentifier")?.Value;
User.FindFirst("NameIdentifier")?.Value;

Еще одно обновление Я использую UserClaimsPrincipalFactory и ломаю его, глядя на утверждения. Я вижу, что всете, которые я хочу, там. Но опять же, они не доступны в моих контроллерах API, как видно на первом рисунке. enter image description here

1 Ответ

0 голосов
/ 26 октября 2019

Я наконец понял проблему, во многом благодаря комментариям Руарда ван Элбургса и ответу, который он дал в связанном вопросе IdentityServer4 Role Based Authorization .

Проблема в том, что заявки не добавляются в токен доступа. Существует два токена: токен доступа и токен идентификации. - Руард ван Элбург

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

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

Решением моей проблемы было добавление этого в Startup.ConfigureServices

services
    .AddIdentityServer(options => {})
    .AddApiAuthorization<ApplicationUser, ApplicationDbContext>(options =>
    {
        foreach (var c in options.ApiResources)
        {
            // the string name of the token I want to include
            c.UserClaims.Add(AccountStatic.ClaimTypes.Claim_Id); 
        }
    });

Я до сих пор не понял, как получить токен Identity, но, поскольку я сейчас включаю идентификатор пользователя в токен доступа, мои проблемы на данный момент решены.

...