我使用实体框架MembershipReboot和IdentityServer3进行了C#.NET项目设置。
我正在查看数据库,并看到UserClaims
表。在此表中,我使用MembershipReboot AddClaim
方法添加了一些声明。
来自UserClaims
表的声明以某种方式添加到ClaimsPrincipal
。当我向Controller
发送请求时,我可以看到这一点。在控制器ActionResult
方法中,我有以下几行代码:
var claimsPrincipal = User as ClaimsPrincipal;
if (claimsPrincipal != null)
{
var userClaims = claimsPrincipal.Claims;
在此示例中,userClaims
将包含来自MembershipReboots UserClaims
表的声明。
以类似的方式,我想在不使用UserClaims表的情况下向ClaimsPrincipal
添加一些额外的声明。这个想法是,如果用户是组的成员,那么他们将继承与该组相关联的声明。我已经创建了一个单独的表格,我将这些群组声明存储在其中 - 但是我在向ClaimsPrincipal
添加这些声明时遇到了问题。
我一直在关注MembershipReboot中的SamAuthenticationService
但是我不确定我是否正在找对方。
更熟悉MembershipReboot和IdentityServer的人是否能指出我正确的方向?
答案 0 :(得分:0)
在进行了一些挖掘之后,我发现了收集声明的位置并将其添加到MembershipReboot中的ClaimsPrincipal
。
ClaimsPrincipal
设置在Sign In
method in the AuthenticationService
内。在创建SignIn
之前,ClaimsPrincipal
方法会执行以下操作。
UserClaims
表中的声明)。UserAccountService.MapClaims
UserAccountService.MapClaims
方法执行MapClaimsFromAccount<TAccount>
命令。此时,您可以使用MembershipReboot实际注册处理程序以运行自定义声明映射器。您的映射器将被执行,您返回的声明将添加到ClaimsPrincipal
。
我花了一段时间才发现这一点 - 但GitHub Issue给了我很多帮助。我将复制下面的代码。
基本上你要做的是创建一个实现CustomMapper
的{{1}}。 ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>
是您自己的扩展RelationalUserAccount
的类。
CustomUserAccount
这是您用于映射自己的自定义声明的代码。上面给出的声明仅仅是示例。这些声明可以是您申请所需的任何声明。
public class CustomClaimsMapper : ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>
{
public void Handle(MapClaimsFromAccount<CustomUserAccount> cmd)
{
cmd.MappedClaims = new System.Security.Claims.Claim[]
{
new System.Security.Claims.Claim(ClaimTypes.GivenName, cmd.Account.FirstName),
new System.Security.Claims.Claim(ClaimTypes.Surname, cmd.Account.LastName),
};
}
}
您可以在此处为自定义映射器添加命令处理程序。
现在创建public static MembershipRebootConfiguration<CustomUserAccount> config;
static MembershipRebootUserServiceFactory()
{
config = new MembershipRebootConfiguration<CustomUserAccount>();
//Add a handler for the Custom User Account Type
config.AddCommandHandler(new CustomClaimsMapper());
}
时,它将包含您从自定义映射器返回的所有声明。