2015-04-28 39 views
3

我正在開發一個ASP.net WebAPI應用程序,並使用獨立的STS(令牌服務)和自定義JSON格式程序(ServiceStack.Text)進行OAUTH 2.0身份驗證。自定義WebAPI「訪問被拒絕」響應

我試圖自定義訪問被拒絕的對象/消息,使其與其他錯誤消息同質,但我還沒有找到一種方法來改變它。

我也認爲在這種情況下使用默認的格式化程序。

實施例:

{ 
    "Message": "Authorization has been denied for this request." 
} 

實施例的結果:

{ 
    "message": "... insert error message here ...", 
    "details": null 
} 

預先感謝。

回答

6

您可以使用可定義其成員的類返回當前HttpActionContext的自定義響應。

  public override void OnActionExecuting(HttpActionContext actionContext) 
      { 
        bool isAuthenticated = IsAuthenticated(actionContext); 

        if (!isAuthenticated) 
        { 
         actionContext.Response = actionExecutedContext.Request.CreateResponse<CustomActionResult>(HttpStatusCode.Unauthorized, new CustomActionResult 
         { 
          Message = "... insert error message here ...", 
          Details = null 
         }); 
        } 
       } 
      } 

      public class CustomActionResult 
      { 
       public string Message { get; set; } 
       public string Details { get; set; } 
      } 
+0

謝謝你的建議,但它是如何在API行爲不進行認證? – iRubens

+0

您可以定義您自己的邏輯以驗證此方法中的Web API請求 - IsAuthenticated(),這必須針對您的應用程序的要求。我沒有發佈與我的應用程序相關的邏輯功能,可能對您沒有任何用處。你知道什麼時候API請求應該被拒絕爲未經授權以及何時應該被允許。 –

0

要改變這一切「拒絕訪問」的消息爲您的整個ASP.NET網站,你可以爲所有未獲授權狀態的HttpModule從您的網站返回。在HttpModule中,您可以處理EndRequest事件,並且您可以檢查response.StatusCode(如果它是401),則可以將消息更改爲任何所需內容。像這樣:

public class AuthorizeMsgModule : IHttpModule 
    {    
     public void Init(HttpApplication context) 
     {     
      context.EndRequest += OnApplicationEndRequest; 
     } 


     // If the request was unauthorized, modify the response sent to the user 
     private static void OnApplicationEndRequest(object sender, EventArgs e) 
     { 
      var response = HttpContext.Current.Response; 
      if (response.StatusCode == 401) 
      { 
       response.ClearContent(); 
       response.Write("{\"message\": \"... insert error message here ...\",\"details\": null}");      
      } 
     } 

     public void Dispose() 
     { 
     } 
    } 

註冊你的模塊在你的web.config例如:

<modules runAllManagedModulesForAllRequests="true"> 
    <add name="AuthorizeMsgModule" type="mynamespace.AuthorizeMsgModule, myassembly" /> 
</modules> 

這會給你你寫的任何時間的內容,您返回401個狀態。正如你可以在這裏看到的小提琴手。

fiddler