2017-12-06 18 views
1

を動作していないここに私のOAuthAuthorizationOptionsASP.NET APIのOAuth2更新トークンは - 逆シリアル化のチケットが、私はASP.NET API2とOWIN、次のコードでのOAuth 2リフレッシュトークンを実装しています

public static OAuthAuthorizationServerOptions AuthorizationServerOptions 
    { 
     get 
     { 
      if (_AuthorizationServerOptions == null) 
      { 
       _AuthorizationServerOptions = new OAuthAuthorizationServerOptions() 
       { 
        AuthenticationType = OAuthDefaults.AuthenticationType, 
        AllowInsecureHttp = true, 
        TokenEndpointPath = new PathString(AuthSettings.TokenEndpoint), 
        AuthorizeEndpointPath = new PathString(AuthSettings.AuthorizeEndpoint), 
        AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(AuthSettings.TokenExpiry), 
        Provider = new CustomOAuthAuthorizationServerProvider(AuthSettings.PublicClientId), 
        // TODO: Remove the dependency with Thinktecture.IdentityModel library here 
        AccessTokenFormat = new CustomJWTFormat(), 
        RefreshTokenProvider = new CustomRefreshTokenProvider() 
       }; 
      } 
      return _AuthorizationServerOptions; 
     } 
    } 

は私CustomRefreshTokenProviderクラスです私は Postman refresh token サーバリターン400不正な要求のステータスコードを以下のようにトークンエンドポイントにPOSTリクエストを送信するために郵便配達を使用している

public override Task CreateAsync(AuthenticationTokenCreateContext context) 
    { 
     var identifier = context.Ticket.Identity.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier); 
     if (identifier == null || string.IsNullOrEmpty(identifier.Value)) 
     { 
      return Task.FromResult<object>(null); 
     } 
     var refreshToken = HashHelper.Hash(Guid.NewGuid().ToString("n")); 
     var tokenIssued = DateTime.UtcNow; 
     var tokenExpire = DateTime.UtcNow.AddSeconds(AuthSettings.RefreshTokenExpiry); 
     context.Ticket.Properties.IssuedUtc = tokenIssued; 
     context.Ticket.Properties.ExpiresUtc = tokenExpire; 
     context.Ticket.Properties.AllowRefresh = true; 
     var protectedTicket = context.SerializeTicket(); 
     AuthService.AddUserRefreshTokenSession(
      identifier.Value, 
      refreshToken, 
      tokenIssued, 
      tokenExpire, 
      protectedTicket); 
     context.SetToken(refreshToken); 
     return Task.FromResult<object>(null); 
    } 
    public override Task ReceiveAsync(AuthenticationTokenReceiveContext context) 
    { 
     var refToken = context.Token; 
     var protectedTicket = AuthService.GetProtectedTicket(refToken); 
     if (!string.IsNullOrEmpty(protectedTicket)) 
     { 
      context.DeserializeTicket(protectedTicket); 
     } 
     return Task.FromResult<object>(null); 
    } 

。 私はデバッグおよびcontext.DeserializeTicket(protectedTicket) は例外

Exception thrown: 'System.Security.Cryptography.CryptographicException' in System.Web.dll 

を投げることがわかった私は AuthSettings.RefreshTokenExpiryは、今から30日間ですので、それが有効期限の問題ではないと思います。 また、私のweb.configにマシンキーを追加しようとしましたOAuth Refresh Token does not deserialize/invalid_grant

まだ動作しません。

アイデアはありますか? すべてのソリューションは高く評価されます。

+0

あなたは解決策を見つけましたか、まったく同じ問題があります。 –

+0

@Amin K遅れて申し訳ありませんが、私はちょうど答えた、それはあなたが必要なものですか? –

答えて

0

ご迷惑をおかけしました。 私はこの問題を解決し、あなたはまだThinktectureを使用したい場合、それは何らかの形で別の解決System.IdentityModel.Tokens.JWT.dll

との競合だから、私のプロジェクトのうち、完全にThinktecture.Identityを削除するソリューションで終わるています.IdentityはSystem.IdentityModel.Tokens.JWTをv4.0.2.206221351にダウングレードしています(このバージョンは私のために働いた、私は別のバージョンでテストしていない)。 Startup.csで(あなたが同じマシンでのリソースサーバと認証サーバをホストする場合)ここで

がCustomJWTFormat.cs

 


    using Microsoft.Owin.Security; 
    using Microsoft.Owin.Security.OAuth; 
    using MST.Service.Core.Logging; 
    using System; 
    using System.Security.Claims; 

    namespace MST.Service.Core.Auth 
    { 
     public class CustomJWTFormat : ISecureDataFormat 
     { 
      private byte[] _SymetricKey = null; 
      public CustomJWTFormat() 
      { 
       _SymetricKey = Convert.FromBase64String(AuthSettings.JwtTokenSecret); 
      } 
      /// 
      /// Create jwt token 
      /// 
      /// 
      /// Token string 
      public string Protect(AuthenticationTicket data) 
      { 
       var tokenHandler = new System.IdentityModel.Tokens.JwtSecurityTokenHandler(); 

       var now = DateTime.UtcNow; 
       System.IdentityModel.Tokens.JwtSecurityToken jwtSecurityToken = new System.IdentityModel.Tokens.JwtSecurityToken(
        AuthSettings.Issuer, 
        AuthSettings.JwtAudiences, 
        data.Identity.Claims, 
        DateTime.UtcNow, 
        DateTime.UtcNow.AddMinutes(AuthSettings.TokenExpiry), 
        new System.IdentityModel.Tokens.SigningCredentials(
         new System.IdentityModel.Tokens.InMemorySymmetricSecurityKey(_SymetricKey), 
        System.IdentityModel.Tokens.SecurityAlgorithms.HmacSha256Signature, 
        System.IdentityModel.Tokens.SecurityAlgorithms.Sha256Digest) 
        ); 
       var token = tokenHandler.WriteToken(jwtSecurityToken); 
       return token; 
      } 

      public AuthenticationTicket Unprotect(string protectedText) 
      { 
       var tokenHandler = new System.IdentityModel.Tokens.JwtSecurityTokenHandler(); 
       var validationParameters = new System.IdentityModel.Tokens.TokenValidationParameters() 
       { 
        RequireExpirationTime = true, 
        ValidateIssuer = true, 
        ValidateLifetime = true, 
        AuthenticationType = OAuthDefaults.AuthenticationType, 
        ValidIssuers = new string[] { AuthSettings.Issuer }, 
        ValidAudiences = new string[] { AuthSettings.JwtAudiences }, 
        ValidateAudience = true, 
        ValidateIssuerSigningKey = false, 
        IssuerSigningKey = new System.IdentityModel.Tokens.InMemorySymmetricSecurityKey(_SymetricKey) 

       }; 
       System.IdentityModel.Tokens.SecurityToken securityToken = null; 

       ClaimsPrincipal principal = null; 
       try 
       { 
        principal = tokenHandler.ValidateToken(protectedText, validationParameters, out securityToken); 
        var validJwt = securityToken as System.IdentityModel.Tokens.JwtSecurityToken; 

        if (validJwt == null) 
        { 
         throw new ArgumentException("Invalid JWT"); 
        } 
       } 
       catch (Exception ex) 
       { 
        LoggerManager.AuthLog.Error($"Parse token error: {ex.ToString()}"); 
        return null; 
       } 

       // Validation passed. Return a valid AuthenticationTicket: 
       return new AuthenticationTicket(principal.Identity as ClaimsIdentity, new AuthenticationProperties()); 
      } 
     } 
    } 

 

とJWTBearerAuthenticationOptionsのコードである

public static JwtBearerAuthenticationOptions JwtAuthenticationOptions 
    { 
     get 
     { 
      if (_JwtAuthenticationOptions == null) 
      { 
       _JwtAuthenticationOptions = new JwtBearerAuthenticationOptions() 
       { 
        //AuthenticationMode = Microsoft.Owin.Security.AuthenticationMode.Passive, 
        AuthenticationType = OAuthDefaults.AuthenticationType, 
        AllowedAudiences = new[] { AuthSettings.JwtAudiences }, 
        IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[] 
        { 
         new SymmetricKeyIssuerSecurityTokenProvider(AuthSettings.Issuer, AuthSettings.JwtTokenSecret) 
        } 
       }; 
      } 
      return _JwtAuthenticationOptions; 
     } 
    } 

同じようにミドルウェアを登録通常

app.UseJwtBearerAuthentication(AuthenticationOptions.JwtAuthenticationOptions); 
関連する問題