2014-09-12 46 views
0

我有一個項目,其中包含MVC和Web API控制器。它使用Windows身份驗證。不過,我想用自定義屬性保護特定的Web API操作。我創建了以下剛拿到的基本流程設置(最終它會檢查用戶的IP地址):自定義屬性不生成

using System.Web; 
using System.Web.Http; 
using System.Web.Http.Filters; 

namespace UoB.People.UserInterface.Mvc.Filters 
{ 
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] 
    public class IPAuthorize : AuthorizationFilterAttribute 
    { 
     protected bool AuthorizeCore(HttpContextBase httpContext) 
     { 
      return true; 
     } 
    } 
} 

我已經裝飾了我的Web API行動,這個屬性的調用。問題是,當我在本地運行我的代碼時,屬性代碼從未被擊中。行動是。此特定操作屬於不使用Windows身份驗證的控制器。

爲什麼我的屬性沒有被調用?它是否需要在某處註冊?有沒有衝突,因爲我的項目包含MVC和Web API控制器?我在某處做了一個簡單的錯誤嗎?

謝謝。

回答

0

終於想通了我的問題。我其實需要重寫OnAuthorization和AuthorizeCore。以下示例演示了這一點:

public class IPAuthorize : AuthorizeAttribute 
{ 
    public string AuthorisedIPs { get; set; } 

    public override void OnAuthorization(HttpActionContext actionContext) 
    { 
     if (AuthorizeCore((HttpContextBase)actionContext.Request.Properties["MS_HttpContext"])) 
      return; 

     base.HandleUnauthorizedRequest(actionContext); 
    } 

    protected bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     // Logic here. 
    } 
} 

希望這有助於其他人遇到問題。

2

您需要在FilterConfig.cs類的RegisterGlobalFilters中註冊屬性。

希望這會有所幫助。

+0

不,這會將過濾器註冊爲全局,即將其稱爲所有請求。 – ondra 2015-01-13 00:10:23