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