如何在ASP.NET身份中传递cookie中的声明?

时间:2017-03-29 11:17:40

标签: c# asp.net asp.net-mvc cookies asp.net-identity

我正在尝试在Cookie中保存Guid值。我希望保存它的方法是为用户设置Claim并将其恢复到每个控制器中以进行验证。

在继续讨论这个主题之前,我已经看到了这个问题here,但它没有解决我的问题!

这是登录控制器中的代码:

 public async Task<ActionResult> Login_Post(LoginViewModel loginViewModel)
    {
        if (ModelState.IsValid)
        {
            var user = IdentityManager.UserManager.FindByName(loginViewModel.Username);
            if (user != null)
            {
                IdentityManager.SignInManager.AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
                var status = SignInStatus.Failure;
                if (!user.IsApproved)
                {
                    status = SignInStatus.Failure;
                }
                if (!await IdentityManager.UserManager.IsEmailConfirmedAsync(user.Id))
                {
                    status = SignInStatus.EmailNotConfirmed;
                }
                status = (SignInStatus)await IdentityManager.SignInManager
                    .PasswordSignInAsync(loginViewModel.Username, loginViewModel.Password, loginViewModel.RememberMe, true);
                if (status == SignInStatus.Failure)
                {
                    await IdentityManager.UserManager.AccessFailedAsync(user.Id);
                    if (await IdentityManager.UserManager.IsLockedOutAsync(user.Id))
                    {
                        status = SignInStatus.LockedOut;
                    }
                }
                switch (status)
                {
                    case SignInStatus.Success:
                        var identity = await IdentityManager.UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
                        var permissions = IdentityManager.ApplicationDbContext.UserVesselPermissions(Guid.Parse(identity.GetUserId()), DateTime.Now).ToList();
                        var userVesselPermissionsResult = permissions.FirstOrDefault();
                        identity.AddClaim(userVesselPermissionsResult != null
                            ? new Claim(SealogicalClaimUtility.VesselId, userVesselPermissionsResult.VesselId.ToString())
                            : new Claim(SealogicalClaimUtility.VesselId, ""));
                        IdentityManager.SignInManager.AuthenticationManager.SignIn(identity);
                        return RedirectToAction("Index", "HomeDashboard", new {area = "Dashboard"});
                    case SignInStatus.Failure:
                        ModelState.AddModelError("", "Login failed, username or password is incorrect.");
                        break;
                    case SignInStatus.RequiresVerification:
                        ModelState.AddModelError("", "Your account needs verification");
                        break;
                    case SignInStatus.LockedOut:
                        ModelState.AddModelError("",
                            "Login failed, this account has been locked. Contact administrator for further information.");
                        break;
                    case SignInStatus.EmailNotConfirmed:
                        ModelState.AddModelError("",
                            "Login failed, activate this account by clicking the email sent to your email account.");
                        break;
                    default:
                        ModelState.AddModelError("",
                            "Login failed, unkwon error. Contact administrator for further information");
                        break;
                }
            }
        }
        return View("Login", loginViewModel);
    }

我正在使用PasswordSignInAsync()方法进行登录验证,因为我需要返回SignInStatus以便向用户显示正确的消息。

之后我在here中阅读了这个问题并且他们说要创建一个ClaimsIdentity,然后再次使用AuthenticationManager来登录ClaimsIdentity对象,就像我一样这里:

case SignInStatus.Success:
     var identity = await IdentityManager.UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
     var permissions = IdentityManager.ApplicationDbContext.UserVesselPermissions(Guid.Parse(identity.GetUserId()), DateTime.Now).ToList();
     var userVesselPermissionsResult = permissions.FirstOrDefault();
     identity.AddClaim(userVesselPermissionsResult != null
     ? new Claim(SealogicalClaimUtility.VesselId, userVesselPermissionsResult.VesselId.ToString())
     : new Claim(SealogicalClaimUtility.VesselId, ""));
     IdentityManager.SignInManager.AuthenticationManager.SignIn(identity);
     return RedirectToAction("Index", "HomeDashboard", new {area = "Dashboard"});

SealogicalClaimUtility作为静态类,如下所示:

public static class SealogicalClaimUtility 
{
     public const string VesselId = "http://schemas.xmlsoap.org/ws/2005/05/identity/claims/vesselid";
}

到目前为止一切正常,但当我试图找回Claim它根本不存在时。

要回到那个蛤蜊,我使用如下的自定义属性:

    public static Guid? UserSelectedVesselId
    {
        get
        {
            var hasVesselClaim = ((ClaimsIdentity) HttpContext.Current.User.Identity)
                .HasClaim(claim => claim.Type == SealogicalClaimUtility.VesselId);
            if (hasVesselClaim)
            {
                var vesselClaim = ((ClaimsIdentity) HttpContext.Current.User.Identity).Claims.FirstOrDefault(
                    claim => claim.Type == SealogicalClaimUtility.VesselId);
                if (vesselClaim != null)
                {
                    Guid vesselId;
                    if (Guid.TryParse(vesselClaim.Value, out vesselId))
                    {
                        return vesselId;
                    }
                }
                return null;
            }
            var currentUserPermission = UserVesselPermissions.FirstOrDefault();
            return currentUserPermission?.VesselId;
        }
    }

知道我在这里做错了吗?

提前致谢!

我正在使用ASP.NET Identity版本2

0 个答案:

没有答案