0

我有一个使用 Entity Framework、MembershipRebootIdentityServer3的 C# .NET 项目设置。

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

来自UserClaims以某种方式添加到ClaimsPrincipal. 当我向我的Controller. 在控制器ActionResult方法中,我有以下几行代码:

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

在此示例userClaims中,将包含 MembershipRebootsUserClaims表中的声明。

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

我一直在看SamAuthenticationServiceMembershipReboot 但我不确定我是否在正确的地方寻找。

更熟悉 MembershipReboot 和 IdentityServer 的人能否指出我正确的方向?

4

1 回答 1

0

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

ClaimsPrincipal是在 中的方法Sign In内设置的AuthenticationService。该SignIn方法在创建ClaimsPrincipal.

  1. 收集 MembershipReboot 管理的声明(包括UserClaims表中的声明)。
  2. 通过调用获取自定义声明UserAccountService.MapClaims

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

我花了一段时间才找到这个——但是这个GitHub 问题帮助很大。我将下面的代码复制出来。

本质上,您所做的是创建一个CustomMapper实现ICommandHandler<MapClaimsFromAccount<CustomUserAccount>>. CustomUserAccount你自己的扩展类在哪里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创建它时,它将包含您从自定义映射器返回的任何声明。

于 2017-03-13T18:38:15.897 回答