ASP.NET Core MVC自定义标识属性

时间:2017-07-10 19:58:18

标签: c# asp.net-core asp.net-core-mvc asp.net-core-1.1 asp.net-core-identity

我正在尝试在ASP.NET Core MVC中构建一个网站,并且正在使用Microsoft.Identity库。我在User(ApplicationUser)类中有一个名为Token的自定义属性。我想在登录时用该令牌创建一个cookie。所以我需要调用一些函数,允许我从登录用户中获取Token属性(通过UserManager或其他任何东西。它必须是登录的用户。)

我在互联网上搜索过,通过创建自定义工厂然后将其添加到startup.cs Like this找到了几个解决方案。但我无法找到或看到进入该物业的方法。 User.Identity.GetToken()不起作用。

这是我的自定义工厂:

 public class CustomUserIdentityFactory : UserClaimsPrincipalFactory<User, IdentityRole>
    {
        public CustomUserIdentityFactory(UserManager<User> userManager, RoleManager<IdentityRole> roleManager, IOptions<IdentityOptions> optionsAccessor) : base(userManager, roleManager, optionsAccessor)
        {}

        public override async Task<ClaimsPrincipal> CreateAsync(User user) {
            var principal = await base.CreateAsync(user);

            if(!string.IsNullOrWhiteSpace(user.Token)) {
                ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                    new Claim(ClaimTypes.Hash, user.Token)
                });
            }

            return principal;
        }
    }

以下是我Startup.cs

中的配置
services.AddScoped<IUserClaimsPrincipalFactory<User>, CustomUserIdentityFactory>();

所以,长话短说:我正在尝试访问自定义标识属性并找到了将其添加到UserManager的方法,但无法找到访问它的方法。

1 个答案:

答案 0 :(得分:2)

您的“CustomUserIdentityFactory”向已登录用户添加声明,以便将声明添加到Cookie中,可以通过指定声明类型使用“User.Claims”进行访问。

假设您的声明类型为“http://www.example.com/ws/identity/claims/v1/token

使用您自己的声明类型覆盖“CreateAsync”方法,更改以下代码。

public override async Task<ClaimsPrincipal> CreateAsync(User user) {
            var principal = await base.CreateAsync(user);
            var tokenClaimType = "http://www.example.com/ws/identity/claims/v1/token"

            if(!string.IsNullOrWhiteSpace(user.Token)) {
                ((ClaimsIdentity)principal.Identity).AddClaims(new[] {
                    new Claim(tokenClaimType, user.Token)
                });
            }

            return principal;
        }

如何在"User.Claims"

中访问令牌
var tokenClaimType = "http://www.example.com/ws/identity/claims/v1/token"
var token = User.Claims.Where(claim => claim.Type == tokenClaimType);

希望这有帮助。