2013-02-26 17 views
14

我有一個使用Windows身份驗證的MVC4 Web應用程序,這是在web.config中我有
<authentication mode="Windows" /> 這工作正常,一切正常。在單個控制器MVC4使用匿名身份驗證時,整個應用程序使用Windows Authenticaion

但是現在我需要一個控制器(實際上是一個Web API控制器),它應該可以從第三方組件中匿名訪問。問題是每次我想調用這個方法時,它都會請求用戶憑據。

我試着把AllowAnonymous屬性放到控制器和方法上,但沒有成功。

[AllowAnonymous] public bool Get(string Called, string Calling, string CallID, int direction)

我查了兩個IIS Express和IIS 8啓用匿名身份驗證和Windows身份驗證。

看來,Windows身份驗證先於任何其他身份驗證,不能被覆蓋。

有沒有辦法做到這一點?

回答

14

將此添加到您的Web.config。在這裏,我的控制器被命名爲「WebhookController」。

<location path="Webhook"> 
    <system.web> 
    <authorization> 
     <allow users="*"/> 
    </authorization> 
    </system.web> 
</location> 

See this KB article for more info.

編輯 - 正如埃裏克下面所提到的,在MVC應用程序,你不應該使用的web.config <authorization>標籤的安全性。而是使用[Authorize]屬性。這樣做將允許您的[AllowAnonymous]屬性正常工作。 You can read more about this here.

+0

我不認爲這會爲我工作。此設置被''覆蓋,網站仍然需要用戶名和密碼才能訪問。除此之外,我正在使用MVC,而web.config中的這些配置設置可能並不總是有助於路由。 – 2013-03-19 16:37:01

+0

它適合我。我也在MVC3中使用'''。我沒有設置任何特殊的路由規則。您可能需要弄亂位置路徑。 – 2013-03-19 17:36:22

+0

第二次嘗試 - 它的作品。看起來'AllowAnonymous'屬性對於Windows身份驗證來說是不夠的,'location'標籤是最好的。感謝您指點什麼可能是問題的正確解決方案! – 2013-03-20 07:51:40

3

接受的答案似乎是過時了,所以...

在你的web.config,刪除這些行:

<authorization> 
    <deny users="?" /> 
</authorization> 

在Solution Explorer中,單擊您的項目,然後點擊f4(或打開屬性瀏覽器)。啓用匿名身份驗證。

現在您可以自由使用AuthorizeAllowAnonymous屬性。它們非常簡單,Authorize意味着用戶需要被授權才能訪問動作或控制器,AllowAnonymous意味着相反。如果未經授權的用戶嘗試訪問具有Authorize屬性的控制器或操作,它們將被重定向到登錄頁面。如果您將Authorize放在控制器上,則它適用於所有控制器的操作,但AllowAnonymous的操作除外。

0

web.config不應該如圖所示here

爲了達到預期的結果AllowAnonymous[Authorize](並且可能需要一些自定義授權屬性)。要執行

步驟:

  1. 確保IIS既有匿名身份驗證Windows身份驗證配置的Web應用程序/網站

  2. 所有的控制器應使用[Authorize]屬性。如果所有的繼承自一個公共的控制器類(例如BaseController/BaseApiController),那麼這很容易實現。例如: -

    [Authorize] 
    public class BaseController : System.Web.Mvc.Controller 
    { 
    
    } 
    
    
    [Authorize] 
    public class BaseApiController : System.Web.Http.ApiController 
    { 
    
    } 
    
  3. 添加[AllowAnonymous]屬性,都應該是匿名的所有操作。例如: -

    [RoutePrefix("Api/Anonymous")] 
    [Authorize] 
    public class AnonymousController : ApiController 
    { 
        [HttpGet] 
        [Route("GetServiceStatus")] 
        [AllowAnonymous] 
        public string GetServiceStatus() 
        { 
         return "OK"; 
        } 
    } 
    
相關問題