OpenIdDict刷新的id_token不包含角色范围

时间:2019-05-31 03:19:07

标签: c# openiddict

我正在将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流程上的一些重要概念。我可以在不影响应用程序安全性的情况下进行建议的更改吗?

0 个答案:

没有答案