2017-03-29 10 views
2

Guidの値をクッキーに保存しようとしています。私がそれを保存したいのは、ユーザーのためにClaimを設定し、検証のためにすべてのコントローラーに戻すことです。ASP.NET IDのCookieにクレームを渡す方法は?

私はこの質問を見たことがありますが、この質問はhereでしたが、問題は解決しませんでした。私はSignInStatusのために、ユーザに適切なメッセージを表示することを戻って取得する必要がありますので、私は、ログイン検証のためPasswordSignInAsync()方法を使用しています

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); 
    } 

はここでログインコントローラでの私のコードです。静的クラスとして

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を:私はhereでこの質問を読んで、彼らはClaimsIdentityを作成してから、私はここでやったように、そのClaimsIdentityオブジェクトでサインインして再びAuthenticationManagerを使用するように言うその後

以下の下:

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; 
     } 
    } 

私がここで間違ってやっているものを任意のアイデア:

はアサリ、私は以下のようにカスタムプロパティを使用することを取り戻すために?

ありがとうございます!

私は、トークンが作成されたときに2件の

答えて

0

クレームが設定されているASP.NETのアイデンティティのバージョンを使用しています。ドキュメントhereを読むと、grant_type = passwordのトークンがGrantResourceOwnerCredentialsで作成されていることがわかります。それで、あなたはその主張を追加すべきです。

もう1つの方法は、AspNetUserClaimsに行を追加することです。 AspNetRolesのように、これらは新しいトークンを作成するときに自動的にClaimsIdentityに追加されます。

関連する問題