如何将UserClaims添加到ClaimsPrincipal

时间:2017-03-11 17:55:20

标签: c# .net claims-based-identity identityserver3 membershipreboot

我使用实体框架MembershipRebootIdentityServer3进行了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的人是否能指出我正确的方向?

1 个答案:

答案 0 :(得分:0)

在进行了一些挖掘之后,我发现了收集声明的位置并将其添加到MembershipReboot中的ClaimsPrincipal

ClaimsPrincipal设置在Sign In method in the AuthenticationService内。在创建SignIn之前,ClaimsPrincipal方法会执行以下操作。

  1. 收集MembershipReboot管理的声明(包括UserClaims表中的声明)。
  2. 致电UserAccountService.MapClaims
  3. 获取自定义声明

    UserAccountService.MapClaims方法执行MapClaimsFromAccount<TAccount>命令。此时,您可以使用MembershipReboot实际注册处理程序以运行自定义声明映射器。您的映射器将被执行,您返回的声明将添加到ClaimsPrincipal

    我花了一段时间才发现这一点 - 但GitHub Issue给了我很多帮助。我将复制下面的代码。

    基本上你要做的是创建一个实现CustomMapper的{​​{1}}。 ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>是您自己的扩展RelationalUserAccount的类。

    自定义声明映射器

    CustomUserAccount

    这是您用于映射自己的自定义声明的代码。上面给出的声明仅仅是示例。这些声明可以是您申请所需的任何声明。

    注册Mapper

    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()); } 时,它将包含您从自定义映射器返回的所有声明。