添加并保留“临时”声明

时间:2014-05-23 14:56:15

标签: asp.net asp.net-mvc asp.net-identity-2

在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,但我不知道结果可能是什么。

1 个答案:

答案 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);