如何将 UserClaims 添加到 ClaimsPrincipal

How do I add UserClaims to ClaimsPrincipal

我使用 Entity Framework、MembershipReboot and IdentityServer3 设置了一个 C# .NET 项目。

我正在查看数据库,我看到 UserClaims table。在此 table 中,我使用 MembershipReboot AddClaim 方法添加了一些声明。

来自 UserClaims table 的声明以某种方式添加到 ClaimsPrincipal。当我向 Controller 发送请求时,我可以看到这一点。在控制器 ActionResult 方法中,我有以下几行代码:

var claimsPrincipal = User as ClaimsPrincipal;
if (claimsPrincipal != null)
{
    var userClaims = claimsPrincipal.Claims;

在此示例中,userClaims 将包含来自 MembershipReboots UserClaims table 的声明。

以类似的方式,我想在不使用 UserClaims table 的情况下向 ClaimsPrincipal 添加一些额外的声明。这个想法是,如果用户是组的成员,那么他们将继承与该组关联的声明。我创建了一个单独的 table,我将这些组声明存储在其中 - 但实际上我无法将这些声明添加到 ClaimsPrincipal.

我一直在查看 MembershipReboot 中的 SamAuthenticationService,但是我不确定我是否找对了地方。

是否有人更熟悉 MembershipReboot 和 IdentityServer 能够为我指明正确的方向?

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

ClaimsPrincipal设置在Sign In method in the AuthenticationService内。 SignIn 方法在创建 ClaimsPrincipal.

之前执行以下操作
  1. 收集 MembershipReboot 管理的声明(包括 UserClaims table 中的声明)。
  2. 通过调用 UserAccountService.MapClaims
  3. 获取自定义声明

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

我花了一段时间才找到它 - 但这个 GitHub Issue 帮了大忙。我将复制下面的代码。

基本上你所做的是创建一个 CustomMapper 来实现 ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>。其中 CustomUserAccount 是您自己的 class 扩展 RelationalUserAccount.

自定义声明映射器

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());
}

您可以在此处为自定义映射器添加命令处理程序。

现在,当创建 ClaimsPrincipal 时,它将包含您 return 来自自定义映射器的任何声明。