问题描述
我正在使用在 .NET Core 上运行的 Identity Server 4 和一个 .NET Framework v4.6.2 MVC 应用程序。我使用配置文件服务从身份服务器设置其他声明:
public async Task GetProfileDataAsync(ProfileDataRequestContext context)
{
if (context.Caller.Equals("ClaimsProviderAccesstoken") || context.Caller.Equals("ClaimsProviderIdentityToken"))
{
foreach (var group in groups)
{
// Custom logic to add additional claims.
context.IssuedClaims.Add(new Claim(ClaimTypes.Role,groupName));
}
}
}
public Task IsActiveAsync(IsActiveContext context)
{
return Task.CompletedTask;
}
当我尝试使用 .NET Core MVC 客户端时,客户端可以使用此处设置的其他声明。但是,对于在 ASP.NET Framework 中运行的 MVC 客户端,这些声明在 context.AuthenticationTicket.Identity.Claims
中不可用。但是当我检查来自 context.ProtocolMessage.Accesstoken
的访问令牌时,声明就在那里。
app.UseCookieAuthentication(new CookieAuthenticationoptions
{
ExpireTimeSpan = new TimeSpan(0,Configuration.SessionTimeoutInMinutes,0),SlidingExpiration = true,CookieSameSite = Microsoft.Owin.SameSiteMode.None,CookieSecure = CookieSecureOption.Always
});
app.USEOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationoptions
{
ClientId = clientId,Authority = authority,RedirectUri = redirectUri,PostlogoutRedirectUri = redirectUri,ResponseType = "id_token token",Scope = "openid profile roles api",TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = false,},Notifications = new OpenIdConnectAuthenticationNotifications()
{
SecurityTokenValidated = (context) =>
{
// The claims are not available here.
foreach (var claim in context.AuthenticationTicket.Identity.Claims.Where(x => x.Type == JwtClaimTypes.Role).ToList())
{
context.AuthenticationTicket.Identity.AddClaim(new Claim(ClaimTypes.Role,claim.Value));
}
// But,the claims are available in the access token.
context.Response.Cookies.Append("access-token",context.ProtocolMessage.Accesstoken,new Microsoft.Owin.CookieOptions() { SameSite = Microsoft.Owin.SameSiteMode.None,Secure = true });
return Task.Fromresult(0);
},}
});
这里出了什么问题?如果我需要发布更多代码,请告诉我。
解决方法
在 Identity Server 中注册 MVC 客户端时使用 AlwaysIncludeUserClaimsInIdToken = true
。