2017-08-01 6 views
0

用意されていたとき、私は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"); 

    } 

それは例外「非アクティブが設定されていない」スロー。変数 'クレーム'には1つのクレーム名しかありません

しかし、他のページ(リダイレクト後)からGetInactivityFromIdentityメソッドを呼び出すと、正常に動作し、クレームはすべてのクレームで満たされます。なぜそうなのか?

答えて

1

クレームは、auth-cookieにシリアル化されています。 Cookieは、認証時にページを再読み込みするまで設定されません。クッキーからクレームにアクセスしようとすると、HTTPリクエストにクッキーはありません。SignInManagerは、リクエストが完了した直後ではなく、クッキーを設定します。クッキーとクレームを取得するには、リダイレクト/ページリロードサイクルが必要です。

あなたは何らかの理由でクレームを通じてではなく、ユーザーにサインインするときにデータストレージからinactivity値を取得する必要があります。

関連する問題