0

私はを作成してJwtベアラトークンを処理し、ClaimsIdentityを作成しました。しかし、もう一度リクエストを送信すると、許可されたユーザーが表示されず、ClaimsIdentityを再度作成して、ユーザーをCurrentPricipalに再度追加する必要があります。私は間違っているの?OWIN AuthenticationManager.SignInを介してClaimsIdentityを追加していません

public class JwtAuthorizeAttribute : AuthorizeAttribute 
    { 
     private readonly string role; 

     public JwtAuthorizeAttribute() 
     { 
     } 

     public JwtAuthorizeAttribute(string role) 
     { 
      this.role = role; 
     } 

     protected override bool IsAuthorized(HttpActionContext actionContext) 
     { 
      var jwtToken = new JwtToken(); 
      var ctx = actionContext.Request.GetOwinContext(); 
      if (ctx.Authentication.User.Identity.IsAuthenticated) return true; 
      if (actionContext.Request.Headers.Contains("Authorization")) 
      { 
       var token = actionContext.Request.Headers.Authorization.Parameter; 
       try 
       { 
        IJsonSerializer serializer = new JsonNetSerializer(); 
        IDateTimeProvider provider = new UtcDateTimeProvider(); 
        IJwtValidator validator = new JwtValidator(serializer, provider); 
        IBase64UrlEncoder urlEncoder = new JwtBase64UrlEncoder(); 
        IJwtDecoder decoder = new JwtDecoder(serializer, validator, urlEncoder); 
        var json = decoder.Decode(token, SiteGlobal.Secret, verify: true); 
        jwtToken = JsonConvert.DeserializeObject<JwtToken>(json); 
        if (jwtToken.aud != SiteGlobal.Audience || jwtToken.iss != SiteGlobal.Issuer || role != jwtToken.role) 
        { 
         return false; 
        } 
       } 
       catch (TokenExpiredException) 
       { 
        return false; 
       } 
       catch (SignatureVerificationException) 
       { 
        return false; 
       } 
      } 
      else 
      { 
       return false; 
      } 
      var identity = new ClaimsIdentity("JWT"); 
      identity.AddClaim(new Claim(ClaimTypes.Name, jwtToken.unique_name)); 
      identity.AddClaim(new Claim(ClaimTypes.Role, jwtToken.role)); 
      ctx.Authentication.SignIn(new AuthenticationProperties { IsPersistent = true }, identity); 
      Thread.CurrentPrincipal = new ClaimsPrincipal(identity); 
      HttpContext.Current.User = new ClaimsPrincipal(identity); 
      return true; 
     } 
    } 

答えて

0

サインインを使用してクッキーを作成します。サインインを処理するためのCookie認証ミドルウェアがありますか?

+0

いいえ、私はjwtトークンを使用していますが、完全にこの場合に許可されたユーザーを作成する方法と混同しているようです。 –

+1

JWTはすべての要求に対して送信され、検証されるように設計されています。サインインへの呼び出しは何もしていません。これはCookieでのみ動作します。 – Tratcher

+0

ありがとうございました。これは多く説明しています。実際にあなたは答えとして追加することができます。 –

関連する問題