如何将 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
.
之前执行以下操作
- 收集 MembershipReboot 管理的声明(包括
UserClaims
table 中的声明)。
- 通过调用
UserAccountService.MapClaims
获取自定义声明
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 来自自定义映射器的任何声明。
我使用 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
.
- 收集 MembershipReboot 管理的声明(包括
UserClaims
table 中的声明)。 - 通过调用
UserAccountService.MapClaims
获取自定义声明
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 来自自定义映射器的任何声明。