2015-12-01 31 views
0

我有以下代碼:訪問API控制器時執行代碼

CookieHeaderValue cookie = Request.Headers.GetCookies("session").FirstOrDefault(); 
var isAuthenticated = _userService.IsAuthenticated(cookie); 

if (!isAuthenticated) 
    return Request.CreateErrorResponse(HttpStatusCode.Unauthorized, ""); 

我想這個代碼只要我的API的任何部分被稱爲執行。我沒有找到任何好的解決方案或方法來做到這一點,所以我想我會問這裏。

(我現在所做的是在每個get/post/put/delete中執行代碼,這是可怕的)。

+1

一個全球性的認證過濾器是你在找什麼。 Web API 2 Message生命週期:http://www.asp.net/media/4071077/aspnet-web-api-poster.pdf – Dietz

+0

我根本不想使用身份。 –

回答

0

所以我發現我的問題的最佳解決方案是下面的代碼:

public class CookieFilterAttribute : AuthorizeAttribute 
{ 
    [Inject] 
    public IUserService UserService { get; set; } 

    protected override bool IsAuthorized(HttpActionContext actionContext) 
    { 
     CookieHeaderValue cookie = actionContext.Request.Headers.GetCookies("session").FirstOrDefault(); 
     var isAuthenticated = UserService.IsAuthenticated(cookie); 

     return isAuthenticated; 
    } 
} 
0

您可以爲此使用ActionFilter或AuthorizationFilter。這些屬性類可以用於特定的控制器/操作或全局。所以你不需要重複每個動作的代碼。

有關詳細信息,請參閱link。它顯示了ASP.NET Web API中的一般認證/授權流程以及如何定製它。

1

解決此問題的最佳位置是授權篩選器屬性。見Authentication Filters in ASP.NET Web API 2

主題是過於寬泛,在這裏重複全部,但它歸結爲創建一個屬性:

public class CookieAuthenticationFilterAttribute : Attribute, IAuthenticationFilter 
{ 
    public async Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken) 
    { 
     // your cookie code 
    } 
} 

並將其應用到控制器或動作方法:

[YourCookieAuthentication] 

但請務必閱讀鏈接。

+0

我已經閱讀過幾篇文章,但我希望能夠馬上返回一個HttpResponseMessage並使用屬性不允許我使用「請求」 –

+0

是的,通過設置錯誤結果:'context。 ErrorResult = new AuthenticationFailureResult'和'AuthenticationFailureResult:IHttpActionResult',它具有'Task ExecuteAsync()'。 – CodeCaster

+0

是的,但它後來檢查標題授權,我沒有設置授權標題,它仍然工作? –