C# 当索赔可用时

C# 当索赔可用时,c#,asp.net-identity,claims-based-identity,claims,C#,Asp.net Identity,Claims Based Identity,Claims,我在GenerateUserIdentityAsync方法中添加了一个声明: public class ApplicationUser : IdentityUser { public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager) { var userIdentity = await manager.Crea

我在GenerateUserIdentityAsync方法中添加了一个声明:

public class ApplicationUser : IdentityUser
{
    public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
    {
        var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);

            userIdentity.AddClaim(new Claim(ClaimsStaticStrings.Inactivity, company.Inactivity.ToString()));

        return userIdentity;
    }
}
然后我尝试在帐户/登录方法中获取它:

    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
    {
        var result = await SignInManager.PasswordSignInAsync(model.Username, model.Password, model.RememberMe, shouldLockout: false);
        switch (result)
        {
            case SignInStatus.Success:
                int inactivity = Utils.GetInactivityFromIdentity(User.Identity);
                Response.Cookies.Add(new HttpCookie("inactivity", inactivity.ToString()));

                return RedirectToAction("Index", "Home");
        }
    }


    public static int GetInactivityFromIdentity(IIdentity identity)
    {
        System.Security.Claims.ClaimsIdentity claims = (System.Security.Claims.ClaimsIdentity)identity;

        var claim = claims.FindFirst(Models.ClaimsStaticStrings.Inactivity);

        if (claim != null)
        {
            return int.Parse(claim.Value);
        }
        else
            throw new Exception("Inactivity is not set");

    }
它引发异常。未设置不活动。变量“claims”只有一个声明-名称


但是,当我在重定向后从任何其他页面调用GetInactivityFromIdentity方法时,它工作正常,声明中填充了所有设置的声明。为什么会这样?

声明被序列化为验证cookie。只有在验证时重新加载页面,才能设置Cookie。当您尝试从cookie访问声明时,HTTP请求中没有cookie-SignInManager将仅在请求完成时设置cookie,而不是在请求完成后立即设置cookie。您确实需要一个重定向/页面重新加载周期来获得可用的cookie和声明


您必须以某种方式获得非活动值,而不是通过声明,而是在登录用户时从数据存储中获取。

这是什么?不活动您预定义的一些自定义字符串列表,角色/声明,比如JAVA/C++用户?我的意思是,我开始混合mongoDB和microsoft identity,然后很快就发生了很多事情,过了这么长时间,我忘记了一切,很难知道一切。。。我应该提供索赔吗?还是不?你什么时候做这个?例如,对于主用户,仅限于创始人或。。。何时使用角色?我应该通过吗?给第一个用户?还是全部?