2012-12-24 46 views
2

我試圖確定如何在窗體身份驗證下配置對Web API控制器服務的訪問。如果我添加授權配置通過將授權元素拒絕所有匿名用戶:使用表單身份驗證的Web API匿名服務訪問

<授權>
      < - 拒絕所有匿名用戶 - >
      <拒絕用戶=「? 「/>
< /授權>

只有登錄頁面被訪問的預期。但我也想訪問從控制器返回的列表。我將[AllowAnonymous]屬性添加到一個簡單的服務,該服務返回用於填充下拉菜單的值。例如:

namespace WebAPI.Controllers 
{ 
    public class RegisterController : ApiController 
    { 
     [AllowAnonymous] 
     public List<ListElement> GetActivitiesList() 
     { 
      List<ListElement> li = new List<ListElement>(); 

      li.Add(new ListElement() { Id = 1, Text = "Item 1" }); 
      li.Add(new ListElement() { Id = 2, Text = "Item 2" }); 
      li.Add(new ListElement() { Id = 3, Text = "Item 3" }); 

      return li; 

     } 

    } 
} 

我增加了控制器目錄在web.config允許列表:

<位置路徑= 「控制器」 >
      <的System.Web >
      <授權>
            <允許用戶= 「*」/ >
      < /授權>
      </system.web>
< /位置>

如果我瀏覽我的示例頁面來調用控制器,形成認證即使我添加了[AllowAnonymous]屬性,仍然拒絕使用302重定向到登錄頁面的訪問。如果我刪除了整個站點的授權元素「<拒絕用戶=」?「/ >」,我可以使用[授權]和[允許匿名]屬性來控制訪問。

目標是爲匿名用戶在幾個頁面上使用特定的服務(如註冊),而其餘的站點訪問僅限於經過身份驗證的用戶。訪問服務與訪問文件不完全一樣,所以我的猜測是我必須爲這種情況編寫一個特殊的處理程序,但我不確定如何去處理它。

+0

我應該提到,我更新Web窗體應用程序,通過的NuGet安裝的Web API增強。該項目不是一個MVC應用程序。考慮到潛在的安全風險,最好的做法是創建一個新的Web API應用程序。感謝那個指針。 – John

回答

5

首先,當您使用ASP.NET MVC時,請不要使用老派的ASP.NET允許/拒絕機制來控制訪問。我認爲這不被支持,並且可能會在您的網站上創建安全漏洞(source)。在ASP.NET MVC中控制訪問的正確方法是在您的問題中使用控制器類和/或方法中的[Authorize]和[AllowAnonymous]屬性。

如果您希望整個應用程序都需要登錄每個方法,除了一對夫婦之外,您可以將類級別的[Authorize]屬性應用於所有控制器,然後應用[AllowAnonymous]屬性在那些不需要認證的方法的方法級別。還有寫FilterProvider,例如,它會自動應用[授權]編程屬性不已經應用於這種屬性的任何控制器方式。這很方便,因爲它不會意外忘記應用[Authorize]屬性。有關如何執行此操作的詳細信息,請參閱this article。請注意,在MVC4推出的[使用AllowAnonymous]屬性執行相同的功能自定義[公用]屬性筆者介紹的文章。又見this article哪些談到保護一般MVC應用程序。這兩篇文章有點過時(2011年),但基本的想法仍然健全。

0

所以首先我們不知道該應用程序的其餘任何東西 - 是MVC或Web表單?

如果你的應用程序是MVC,我完全同意布賴恩,你應該使用[授權]和[AllowAnoynmous]上所有的控制器。

如果你不能做到這一點 - 你確實可以「打孔」入規則 - 但你需要使用「真實」的網址,比如

..和耶 - 要小心;)