2016-07-15 59 views
3

我剛剛完成this excellent article有關反對使用ADAL和OWIN中間件組件的ADFS/Windows Azure的AD例如確保與OAuth2用戶的ASP.NET Web API 2應用程序。是否可以針對多個身份驗證提供程序保護ASP.NET Web API 2應用程序?

然而,似乎在這篇文章中描述的整個認證工作流是非常「硬連線」到HTTP請求管道,並且不留任何餘地與其他認證供應商認證流程的執行情況。

這是爲什麼需要?

我有一個移動Web客戶端中,「內部」和「外部」允許用戶以發出針對API端點用戶相關的數據的請求進行身份驗證。

雖然「內部」用戶正在從Azure AD/ADFS獲取身份驗證令牌,但「外部」用戶必須對另一個頒發另一種身份驗證令牌的系統進行身份驗證。

因此,我必須能夠在API端點級別上區分來自「內部」和「外部」用戶的請求,以啓動其不同驗證令牌的正確評估工​​作流程。

就如何實現這一目標的任何跡象將高度讚賞。

問候,馬蒂亞斯

+1

我不知道你的使用情況是什麼,但,這似乎是一些認爲thinktecture與identityserver3使用的例子。 https://identityserver.github.io/Documentation/。我花了一個週末的時間來了解一些例子,但是這很簡單。我還添加了提供管理屏幕的identityreboot。 – Bill

+0

嗨比爾。感謝提示。這絕對是我將考慮的事情,因爲它可以[爲auth令牌實現自定義驗證](https://identityserver.github.io/Documentation/docsv2/configuration/serviceFactory.html)。 –

回答

0

挖一點點後,我發現其中介紹瞭如何編程的方式驗證通過使用JwtSecurityTokenHandler class的ADFS的OAuth 2.0認證流程制定的基於JWT認證令牌following answer。代碼示例可以在鏈接的答案中找到。

這將允許我來創建自定義授權過濾器,其然後我可以作爲控制器或控制器的方法的一個屬性使用。此過濾器將分析客戶端請求中的授權標頭,檢測其中包含的身份驗證令牌的類型,然後啓動相應的程序邏輯以驗證/驗證身份驗證令牌。

沿東西,也許這些線路:

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(); 
    } 
} 
相關問題