ASP.NET Identity EF中的动态用户声明

7
我正在开发一个使用ASP.NET Identity与Entity Framework的身份验证系统,并且我想有一些声明是计算值,而不是硬编码到声明表中。
当用户登录时,如何将动态声明添加到该登录会话中,而不实际将它们添加到声明表中?
例如,我可能想要存储每个用户的出生日期,但如果登录日期与用户的出生日期匹配,我希望添加IsBirthday作为声明。我不想为每个用户存储“IsBirthday”声明,因为每个人的出生日期每天都会改变。
在我的代码中,我使用以下内容进行登录:
var signInResult = await SignInManager.PasswordSignInAsync(username, password, false, false);

调用此方法后,我可以引用ClaimsPrincipal,但Claims属性是IEnumerable类型,而不是List类型,因此我无法添加内容。

编辑:我还应该提到我正在使用Microsoft.AspNet.Identity.Owin库。


根据Chris Pratt的回复,在这种设置下,我将把DOB作为模型属性存储。 - zaparker
1个回答

12

好的,大家,我对 ASP.NET Identity 中提供的类进行了一些研究,并找到了我需要重写的类。SignInManager 类有一个 CreateUserIdentityAsync 方法,正好可以满足我的需求。以下代码将 IsBirthday 声明添加到我的身份验证信息中,但并没有将其存储在数据库中。

public class ApplicationSignInManager : SignInManager<ApplicationUser, string>
{
  public override async Task<System.Security.Claims.ClaimsIdentity> CreateUserIdentityAsync(ApplicationUser user)
  {
      var identity = await base.CreateUserIdentityAsync(user);
      identity.AddClaim(new System.Security.Claims.Claim("IsBirthday", user.DOB.GetShortDateString() == DateTime.Now.GetShortDateString()));
      return identity;
  }

  // ... EXCLUDING OTHER STUFF LIKE CONSTRUCTOR AND OWIN FACTORY METHODS ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接