Обновленный OpenIdDict id_token не содержит области ролей - PullRequest
0 голосов
/ 31 мая 2019

Я использую OpenIdDict с dotnetcore.Кажется, что оба потока предоставления пароля и обновления токена работают нормально: я могу войти с пользователем / паролем, и мой токен доступа обновляется после истечения срока действия.

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

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

Код, о котором я говорю, таков:

private async Task<AuthenticationTicket> CreateTicketAsync(OpenIdConnectRequest request, User user)
{
    var principal = await signInManager.CreateUserPrincipalAsync(user);
    var ticket = new AuthenticationTicket(principal, new AuthenticationProperties(), OpenIdConnectServerDefaults.AuthenticationScheme);

    // Removing this condition, will make the roles available on the id_token after
    // a refresh. Leaving it here, will make the refresh work, but the decoded id_token
    // will not contain the roles.
    if (request.IsRefreshTokenGrantType() == false)
    {
        ticket.SetScopes(new[]
        {
            OpenIdConnectConstants.Scopes.OpenId,
            OpenIdConnectConstants.Scopes.Email,
            OpenIdConnectConstants.Scopes.Phone,
            OpenIdConnectConstants.Scopes.Profile,
            OpenIdConnectConstants.Scopes.OfflineAccess,
            OpenIddictConstants.Claims.Roles
        }
        .Intersect(request.GetScopes()));
    }

    /* ... code omitted: set resources and claims ... */

    return ticket;
}

Конфигурация OpenIdDict выглядит следующим образом:

services
    .AddOpenIddict()
    .AddCore(options =>
    {
        options
            .UseEntityFrameworkCore()
            .UseDbContext<EmpresaDbContext>();
    })
    .AddServer(options =>
    {
        options.UseMvc();
        options.EnableTokenEndpoint(AuthorizationController.TokenPath);

        options
            .AllowPasswordFlow()
            .AllowRefreshTokenFlow();

        options.AcceptAnonymousClients();
        options.DisableHttpsRequirement();

        options.RegisterScopes(
            OpenIdConnectConstants.Scopes.OpenId,
            OpenIdConnectConstants.Scopes.Email,
            OpenIdConnectConstants.Scopes.Phone,
            OpenIdConnectConstants.Scopes.Profile,
            OpenIdConnectConstants.Scopes.OfflineAccess,
            OpenIddictConstants.Claims.Roles);
    });

У меня такое ощущение, что мне не хватает какой-то важной концепции потока OpenId.Могу ли я внести предлагаемое изменение без ущерба для безопасности приложения?

...