2016-08-05 152 views
2

我正在嘗試爲ASP.NET MVC 5網站/應用程序的我的web api控制器部分製作自定義篩選器,以檢查我存儲在數據庫中的特定令牌的請求標頭。我發現的大多數示例都包含用戶憑證,然後用戶使用身份進行身份驗證。不是我正在尋找的東西。Web API自定義身份驗證篩選器

這是我發現並正在關注的tutorial

Web API應該只處理「外部」HTTP調用,網站端目前會有自己的控制器(但可能會有所變化)。

如果可能,此過濾器應與已存在的身份2系統接口。

我所做的是我發送用戶憑證,然後爲用戶分配令牌,然後我想使用該令牌來驗證請求。有沒有一種方法可以根據令牌過濾請求,還是需要使用Owin身份及其令牌管理?我正在使用移動客戶端(目前iOS,也將包括android)撥打電話。我可以參考的任何示例或教程?

令牌當前是字母數字字符和符號的隨機組合。

謝謝。

P.S.我可以在需要的地方發佈代碼片段和內容。

編輯:HTTPRequests將根據它是否包含我們的數據庫/系統中存在的令牌進行過濾。包含令牌或不在我們系統中的請求會收到未經授權的錯誤(401?)

+0

因此令牌位於HTTP請求標頭中? – Botonomous

+0

是的,令牌位於請求標頭中。 – beowulf

+0

你是什麼意思過濾基於令牌的請求?是否每個HTTPReqeust都不包含該令牌,還是隻有在有令牌時才需要過濾請求? – Botonomous

回答

5

假設您認爲向每個請求發送用戶名和密碼都不好。請參閱下面的實現,密碼,因爲我們不會發送每個請求的用戶名和密碼。

public class AuthenticationFilter : AuthorizationFilterAttribute 
    { 
     /// <summary> 
     /// read requested header and validated 
     /// </summary> 
     /// <param name="actionContext"></param> 
     public override void OnAuthorization(HttpActionContext actionContext) 
     { 
      var identity = FetchFromHeader(actionContext); 

      if(identity != null) 
      { 
       var securityService = actionContext.ControllerContext.Configuration.DependencyResolver.GetService(typeof(ILoginService)) as ILoginService; 
       if (securityService.TokenAuthentication(identity)) 
       { 
        CurrentThread.SetPrincipal(new GenericPrincipal(new GenericIdentity(identity), null), null, null); 
       } 
       else 
       { 
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
        return; 
       } 
      } 
      else 
      { 
       actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest); 
       return; 
      } 
      base.OnAuthorization(actionContext); 
     } 

     /// <summary> 
     /// retrive header detail from the request 
     /// </summary> 
     /// <param name="actionContext"></param> 
     /// <returns></returns> 
     private string FetchFromHeader(HttpActionContext actionContext) 
     { 
      string requestToken = null; 

      var authRequest = actionContext.Request.Headers.Authorization; 
      if (authRequest != null && !string.IsNullOrEmpty(authRequest.Scheme) && authRequest.Scheme == "Basic") 
       requestToken = authRequest.Parameter; 

      return requestToken; 
     } 
    } 
2

您可以通過通過屬性(屬性注入)注入服務依賴項來使此過濾器單元可測試。對於自定義屬性,我們不想通過構造函數傳遞依賴關係。我們希望該屬性易於使用 。要重寫什麼@Raj已經開始,它可以是這樣的:

public class AuthenticationFilter : AuthorizationFilterAttribute 
    { 
     [Dependency] 
     public ILoginService LoginService { get; set; } 

     /// <summary> 
     /// read requested header and validated 
     /// </summary> 
     /// <param name="actionContext"></param> 
     public override void OnAuthorization(HttpActionContext actionContext) 
     { 
      var identity = FetchFromHeader(actionContext); 

      if (identity != null) 
      { 
       if (LoginService.TokenAuthentication(identity)) 
       { 
        CurrentThread.SetPrincipal(new GenericPrincipal(new GenericIdentity(identity), null), null, null); 

        //IPrincipal principal = new GenericPrincipal(new GenericIdentity(identity), new string[] { "myRole" }); 
        //Thread.CurrentPrincipal = principal; 
        //HttpContext.Current.User = principal;    
       } 
       else 
       { 
        actionContext.Response = new HttpResponseMessage(HttpStatusCode.Unauthorized); 
        return; 
       } 
      } 
      else 
      { 
       actionContext.Response = new HttpResponseMessage(HttpStatusCode.BadRequest); 
       return; 
      } 
      base.OnAuthorization(actionContext); 
     } 

     /// <summary> 
     /// retrive header detail from the request 
     /// </summary> 
     /// <param name="actionContext"></param> 
     /// <returns></returns> 
     private string FetchFromHeader(HttpActionContext actionContext) 
     { 
      string requestToken = null; 

      var authRequest = actionContext.Request.Headers.Authorization; 
      if (authRequest != null && !string.IsNullOrEmpty(authRequest.Scheme) && authRequest.Scheme == "Basic") 
       requestToken = authRequest.Parameter; 

      return requestToken; 
     } 
    } 
-1

感謝的答覆,一些實驗後,我重新設計了整個API來使用OAuth 2認證與承載令牌。它解決了我的問題與過濾器。

相關問題