在MVC5网络应用程序上,我使用的是Asp.net Identity。当用户注册时,我添加了一些声明,它们被保存在数据库中并在用户登录时恢复。这非常有效。现在,基于参数(登录页面上的复选框),我想在用户登录时向用户添加特定的声明。但有一个问题:此声明只存在于该用户特定会话上(如果同一用户登录另一个浏览器实例或设备而不检查复选框,则他不会有该声明)。我没有使用,也不希望依赖asp.net Session。
我很容易实现了这一点,只需在调用AuthenticationManager.SignIn
时添加声明:
private async Task SignInAsync(CustomUser user, bool isPersistent, bool myCustomTemporaryClaim)
{
var identities = await user.GenerateUserIdentityAsync(UserManager);
if (myCustomTemporaryClaim)
{
identities.AddClaim(new Claim(CustomClaimTypes.MyCustomTemporaryClaim, "true"));
}
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identities);
}
这很好用。但VS模板上的默认asp.net身份实现配置为"刷新"身份每30分钟一次。发生这种情况时,我放弃了我的自定义声明。所以,我想知道的是,有可能"拦截"并在asp.net身份重新生成cookie之前获取我的自定义声明值?
我可以删除regenerateIdentityCallback
,但我不知道结果可能是什么。
答案 0 :(得分:1)
我确定你现在已经知道要做什么,但是为了防止其他人偶然发现这个帖子,我认为你只需要将AddClaim移动到GenerateUserIdentityAsync方法中。然后,当刷新发生并调用regenerateIdentityCallback时,您的声明将被重新添加。
对于您的条件myCustomTemporaryClaim,您可以在GenerateUserIdentityAsync中包含一个参数。有关如何执行此操作以及如何更改回调的详细信息,请参阅此帖子: ExpireTimeSpan ignored after regenerateIdentity / validateInterval duration in MVC Identity (2.0.1)
即。 (注意我使用int作为我的UserId)
private async Task SignInAsync(ApplicationUser user, bool isPersistent, bool myCustomTemporaryClaim)
{
AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var identity = await user.GenerateUserIdentityAsync(UserManager, myCustomTemporaryClaim);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
}
和
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>, IUser<int>
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser, int> manager, bool myCustomTemporaryClaim)
{
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
if (myCustomTemporaryClaim)
{
userIdentity.AddClaim(new Claim(CustomClaimTypes.MyCustomTemporaryClaim, Convert.ToString(true)));
}
return userIdentity;
}
}
顺便说一句,我最后阅读你的帖子的原因是因为我在调用SignInAsync时一直失去我的自定义声明,所以我只是替换了这个
var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
用这个
var identity = await user.GenerateUserIdentityAsync(UserManager);