2016-12-12 59 views
0

我們正在與現有的接入網關結合,有效地進行用戶認證。當用戶通過認證時,訪問網關設置了一些請求頭,並將請求傳遞給我們的底層ASPNET5 MVC6 Web應用程序。使用這些沒有加密值的值,我們可以派生出一些東西,包括登錄人員的用戶名......我們沒有得到密碼或一些奇怪的標記。我們應該如何在ASP.NET 5 MVC6中實現訪問網關認證?

有誰能告訴我們什麼是乾淨/正確的MVC6方式來實現接入網關認證?我們已經看到了幾種身份驗證解決方案,但它要麼是單個令牌,要麼是預期的用戶名+密碼。

回答

0

實際上你很幸運 - 因爲你不必親自處理授權。你需要做的就是通知.NET基礎設施。最簡單的方法是添加你自己的IAuthenticationFilter

此示例假設必須同時「X-直呼其名」和「X-LAST-NAME」出現在請求作爲以HTTP報頭作爲身份驗證的用戶進行處理。

public class CustomHostAuthenticationFilter : IAuthenticationFilter 
{ 
    public bool AllowMultiple { get { return true; } } 

    public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     if (context == null) 
     { 
      throw new ArgumentNullException(nameof(context)); 
     } 

     var request = context.Request; 
     if (request == null) 
     { 
      throw new ArgumentException("Request must not be null.", nameof(context)); 
     } 

     if (request.Headers != null) 
     { 
      string firstName = null; 
      IEnumerable<string> values; 
      if (request.Headers.TryGetValues("X-FIRST-NAME", out values) && values.Any()) 
      { 
       firstName = values.First(); 
      } 

      string lastName = null; 
      if (request.Headers.TryGetValues("X-LAST-NAME", out values) && values.Any()) 
      { 
       lastName = values.First(); 
      } 

      if (!string.IsNullOrEmpty(firstName) && !string.IsNullOrEmpty(lastName)) 
      { 
       var identity = new ClaimsIdentity("JWT"); 
       identity.AddClaim(new Claim(ClaimTypes.Name, firstName + " " + lastName)); 
       var principal = new ClaimsPrincipal(identity); 
       context.Principal = principal; 
      } 
     } 

     return Task.FromResult(0); 
    } 

    public Task ChallengeAsync(HttpAuthenticationChallengeContext context, CancellationToken cancellationToken) 
    { 
     return Task.FromResult(0); 
    } 
} 

然後將過濾器添加到管道中。

services.ConfigureMvc(options => 
{ 
    options.Filters.Add(new CustomHostAuthenticationFilter()); 
} 
+0

這實際上看起來非常好,我明天會試試這個......看起來它可能工作得很好。謝謝。只有一件事,是不是現在叫做IAuthorizationFilter? –

相關問題