0

着信要求のJWTトークンを検証するためにリソースサーバー(Web API 2)をセットアップしました。 JWTトークンはAuth0によって発行され、クライアントはそれをWeb APIに渡します。発行者、オーディエンス、または有効期限が有効でない場合、これはすべて正常に動作し、401応答を生成します。 OwinMiddlewareから派生したカスタムミドルウェアを追加すると、トークン検証ロジックが抑制され、無効なリクエストに対して200の応答が得られます。リソースサーバーのOwinMiddleware実装でトークンの検証が行われない

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var issuer = "my issuer"; 
     var audience= "my audience"; 
     var clientId= "my client id"; 
     app.UseActiveDirectoryFederationServicesBearerAuthentication(
      new ActiveDirectoryFederationServicesBearerAuthenticationOptions 
      { 
       TokenValidationParameters = new TokenValidationParameters 
       { 
        ValidAudience = audience, 
        ValidIssuer = issuer, 
        IssuerSigningKeyResolver = (token, securityToken, identifier, parameters) => parameters.IssuerSigningTokens.FirstOrDefault()?.SecurityKeys?.FirstOrDefault() 
       }, 
       // Setting the MetadataEndpoint so the middleware can download the RS256 certificate 
       MetadataEndpoint = $"{issuer.TrimEnd('/')}/wsfed/{clientId}/FederationMetadata/2007-06/FederationMetadata.xml" 
      }); 



     HttpConfiguration config = new HttpConfiguration(); 

     app.Use<HttpUsernameInjector>(); 

     // Web API routes 
     config.MapHttpAttributeRoutes(); 
     app.UseWebApi(config); 
    } 
} 

と私のカスタムOwinMiddleWare:

public class HttpUsernameInjector : OwinMiddleware 
{ 
    public HttpUsernameInjector(OwinMiddleware next) 
     : base(next) 
    { 
    } 

    public override async Task Invoke(IOwinContext context) 
    { 
     const string usernameClaimKey = "my username claim key"; 

     var bearerString = context.Request.Headers["Authorization"]; 
     if (bearerString != null && bearerString.StartsWith("Bearer ", StringComparison.InvariantCultureIgnoreCase)) 
     { 
      var tokenString = bearerString.Substring(7); 

      var token = new JwtSecurityToken(tokenString); 
      var claims = token.Claims.ToList(); 
      var username = claims.FirstOrDefault(x => x.Type == usernameClaimKey); 

      if (username == null) throw new Exception("Token should have username"); 

      // Add to HttpContext 
      var genericPrincipal = new GenericPrincipal(new GenericIdentity(username.Value), new string[] { }); 

      IPrincipal principal = genericPrincipal; 

      context.Request.User = principal; 
     } 

     await Next.Invoke(context); 
    } 
} 

どのように私は私のカスタムミドルウェアはOWINトークン認証ロジックを抑制/競合を避けるために設定する必要がありますか?

答えて

0

OWINミドルウェアで何も問題はありませんが、context.Request.Userを割り当てても問題はありません。ここで作成されたGenericIdentityには、Readonly IsAuthenticatedがtrueに等しく、falseには設定できません。 context.Request.User = genericPrincipal;を割り当てた場合、の中のIsAuthenticatedIsAuthenticatedに置き換えてgenericPrincipalから上書きします。 Invokeメソッドの開始時に認証結果を確認し、ユーザーが認証されていない場合はロジックをスキップする必要があります。したがって、IsAuthenticatedcontext.Request.Userに変更されませんでした。

public override async Task Invoke(IOwinContext context) 
    { 
     if (context.Authentication.User.Identity.IsAuthenticated) 
     { 
      //my username injection logic 
     } 
     await Next.Invoke(context); 
    } 
関連する問題