2016-07-15 7 views
3

ADALおよびOWINミドルウェアコンポーネントを使用して、ADFS/Windows Azure ADインスタンスに対してOAuth2を使用してASP.NET Web API 2アプリケーションをセキュリティ保護することについて、ちょうどthis excellent articleが終了しました。複数の認証プロバイダに対してASP.NET Web API 2アプリケーションを保護することは可能ですか?

しかし、この記事で説明している認証ワークフロー全体は、HTTP要求パイプラインに非常に "ハードワイヤード"であり、他の認証プロバイダに対して認証ワークフローを実装する余地はありません。

なぜこれが必要ですか?

APIエンドポイントに対してユーザー関連データの要求を発行するために、「内部」ユーザーと「外部」ユーザーの認証が許可されているモバイルWebクライアントがあります。

「内部」ユーザーがAzure AD/ADFSから認証トークンを取得している間、「外部」ユーザーは別の種類の認証トークンを発行する別のシステムに対して認証する必要があります。

したがって、異なる認証トークンの正しい評価ワークフローを開始するために、APIエンドポイントレベルの「内部」ユーザーと「外部」ユーザーの要求を区別することができなければなりません。

これを達成する方法に関する兆候は高く評価されます。

よろしく、マティアス

+1

私はあなたのユースケースが何であるかわからないが、これはthinktectureがidentityserver3で使用する例のいくつかのように思えます。 https://identityserver.github.io/Documentation/。例を取りに行くのに週末が必要でしたが、それはかなり簡単でした。管理画面を提供したidentityrebootも追加しました。 – Bill

+0

こんにちは。ヒントをありがとう。これは間違いなく[認証トークンのカスタム検証を実装する]ことができます(https://identityserver.github.io/Documentation/docsv2/configuration/serviceFactory.html)。 –

答えて

0

I、プログラムJwtSecurityTokenHandler classを使用してADFS OAuth 2.0の認証フローによって発行されたJWT基づいて認証トークンを検証する方法について説明following answerを発見した掘削の少し後。コード例は、リンクされた答えにあります。

これにより、コントローラまたはコントローラメソッドの属性として使用できるカスタム認証フィルタを作成できます。このフィルタは、クライアント要求のAuthorizationヘッダーを分析し、その中に含まれる認証トークンの種類を検出し、それぞれのプログラムロジックを起動して認証トークンを検証/検証します。多分これらの線に沿って

何か:

public enum AuthTokenType 
{ 
    OAuth2Bearer, 
    Custom 
} 

public class CustomAuthenticationAttribute : IAuthenticationFilter 
{ 
    public bool AllowMultiple 
    { 
     get 
     { 
      throw new NotImplementedException(); 
     } 
    } 

    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
      HttpRequestMessage incommingRequest = context.Request; 
      HttpHeaders headers = incommingRequest.Headers; 
      string authHeader = GetHeader(headers, "Authorization"); 
      AuthTokenType authTokenType = DetecteAuthTokenType(authHeader); 

      if (authTokenType == AuthTokenType.OAuth2Bearer) 
      { 
       // Validate auth token using the JwtSecurityTokenHandler class 
      } 
      else if (authTokenType == AuthTokenType.Custom) 
      { 
       // Validate auth token using whatever is necessary 
      } 
      else 
      { 
       // auth token doesn't correspond to a recognized type or hasn't been part of the client request - reject request 
      } 
    } 

    public AuthTokenType DetectAuthTokenType(string authHeader) 
    { 
     // Analyze the authorization header string and return its proper type 
    } 

    private string GetHeader(HttpHeaders headers, string key) 
    { 
     IEnumerable<string> keys = null; 
     if (!headers.TryGetValues(key, out keys)) 
      return null; 

     return keys.First(); 
    } 
} 
関連する問題