我正在使用here找到的IdentityServer4“ AspNetCoreAndApis”示例应用程序
它具有令牌服务器和MVC客户端应用程序。
身份服务器项目具有使用其演示服务器-https://demo.identityserver.io/
设置的外部OIDC身份验证提供程序在MvcClient
中命中受保护的端点后,将其重定向到本地身份服务器,选择并通过演示服务器进行身份验证,然后到达本地身份服务器的ExternalController
回调。此时,我想向用户发出其他声明,并在MvcClient
中提供它们。
回调中有代码添加additionalLocalClaims
并发布cookie。我尝试添加另一个声明:
var additionalLocalClaims = new List<Claim>();
additionalLocalClaims.Add(new Claim("TestKey", "TestValue"));
await HttpContext.SignInAsync(user.SubjectId, user.Username, provider, localSignInProps, additionalLocalClaims.ToArray());
但是,当用户到达HomeController
的{{1}}时,此声明就不存在了。
我认为我不正确地了解在哪里使用哪种身份验证方案以及相关cookie的功能。
编辑:
为响应下面的第一条评论,我尝试将声明附加到请求的范围,但仍然没有运气-这是内存资源存储区:
MvcClient
MvcClient都被允许使用api1范围,并请求它。
答案 0 :(得分:0)
您的客户MVC可以从ID令牌或UserInfo端点获取用户的自定义声明。
要向ID令牌添加声明,您可以设置客户端的配置:AlwaysIncludeUserClaimsInIdToken
。但是建议不要将所有用户声明都包含在ID令牌中,建议您关注ID令牌的大小。
一种更好的解决方案是使您的客户端应用从UserInfo端点获取用户的声明:
public class MyProfileService : IProfileService
{
public MyProfileService()
{ }
public Task GetProfileDataAsync(ProfileDataRequestContext context)
{
var claims = new List<Claim>()
{
new Claim("TestKey", "TestValue")
};
context.IssuedClaims.AddRange(claims);
return Task.CompletedTask;
}
public Task IsActiveAsync(IsActiveContext context)
{
// await base.IsActiveAsync(context);
return Task.CompletedTask;
}
}
在DI中注册:
services.AddTransient<IProfileService, MyProfileService>();
IProfileService
服务可用于向ID令牌,访问令牌和UserInfo端点添加声明。默认情况下,自定义声明不使用IProfileService
参与ID令牌事件,ID令牌大小是上述原因。因此,您可以使用OIDC中间件config来使您的客户端应用从UserInfo端点获取声明:
options.Scope.Add("profile");
options.GetClaimsFromUserInfoEndpoint = true;
options.ClaimActions.MapJsonKey("TestKey", "TestKey");
以上代码将添加OIDC profile
权限以从端点获取声明,并使用ID令牌向connect/userinfo
端点发送请求,并获取声明并将名称为TestKey
的声明映射到您客户的索赔原则并保存到cookie中。现在,您可以在MVC中使用User.Claims
获得声明。