Я использую 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.Могу ли я внести предлагаемое изменение без ущерба для безопасности приложения?