2012-11-20 115 views
0

對不起,基本問題,第一次在C#中使用Web MVC4 ...如何使用活動目錄組保護Web應用程序?

我正在爲我用C#/ SQL編寫的應用程序創建Web界面。我已經能夠將MVC4框架附加到SQL DB。現在我想確保人們可以根據AD的組員身份進行操作。我將web.config中的身份驗證設置爲「Windows」,並正確顯示我登錄的User.Identity.Name。所以我知道它拉起了當前登錄的用戶。更重要的是,我需要能夠在android或ipad設備的情況下對活動目錄域以外的用戶進行身份驗證。我還沒有得到那麼多,儘管...大多數情況下,我想自動驗證登錄用戶如果可能,然後提示輸入用戶名/密碼,如果不存在。

好吧,我也已經知道如何爲AD中的用戶提供組員資格。但我需要運行該AD查詢並將該信息存儲在可在每個頁面上訪問的地方。然後在每個頁面上我如何訪問該變量?

例如,我不想顯示菜單選項,如果他們無法訪問它,因此需要使用變量來顯示或不顯示受保護的菜單選項。另外,我假設我需要在網頁上添加該安全性,以便如果有人試圖手動去那裏,他們不能。

我以爲我不想使用會話變量出於安全原因..

在與Adobe Flex我用了一個單身管理會話狀態的過去。我在那裏做了一個搜索,人們都說C#中這可能不是個好主意。反正這個例子不多...

你在做什麼?

+0

可能的[ASP.NET Active Directory角色提供程序通過web.config]的重複(http://stackoverflow.com/questions/8010461/asp-net-active-directory-role-provider-via-web-config) –

+0

不錯,這是我的問題的一部分。我確信另一部分也被問到,但我不確定我是否在正確的條件下進行搜索。如果用戶未通過Windows身份驗證自動進行身份驗證,那麼如何將表單登錄存儲/使用到域中? –

回答

0

這是我會推薦的。開始尋找ActiveDirectoryMembershipProvider Class的例子。此MembershipProvider加上Forms Authentication將爲您提供一個安全的系統來驗證用戶。

一旦通過身份驗證,您需要授權用戶通過將Active Directory Role Provider(ADRP)(用於確定用戶組)與Securing your MVC Application的標準方式相結合來訪問資源。

爲了讓你開始,我們創建了這些簡單的擴展方法,當你可以擴展到使用ADRP(因爲我沒有使用ADRP)。

public static class IPrincipalExtensions 
{ 
     private static _adminName = "Administrator"; 

    public static bool IsAnonymous(this IPrincipal instance) 
    { 
     return (instance == null); 
    } 

    public static bool IsAdminOrInRole(this IPrincipal instance, string role) 
    { 
     if (instance == null 
      || instance.Identity == null 
      || !instance.Identity.IsAuthenticated) 
     { 
      return false; 
     } 

     bool result = instance.IsInRole(role) 
         || instance.IsInRole(IPrincipalExtensions._adminName)); 

     return result; 
    } 

} 

然後我還延長了默認AuthorizeAttibute給我一個屬性,我可以只使用管理員:

public class AuthorizeAdministratorAttribute : AuthorizeAttribute 
{ 
    protected override bool AuthorizeCore(HttpContextBase httpContext) 
    { 
     if (httpContext == null) 
     { 
      throw new ArgumentNullException("httpContext"); 
     } 

     bool result = false; 
     IPrincipal user = httpContext.User; 

     if (user.Identity.IsAuthenticated) 
     { 
      result = user.IsAdmin(); 
     } 

     return result; 
    } 
} 

這將使用在我IPrincipalExtensions提供的相同的擴展方法,所以我不重複自己。

[Authorize("Administrator")] 
[AuthorizeAdministrator] 

然而,由於第一個例子是使用一個字符串,一個簡單的輸入錯誤拒絕訪問,如果我決定改變角色/組名「:如下面兩行相等有些人可能會覺得這矯枉過正管理員「變得更加困難。所以使用第二個(我可以爭論的是強類型)如果組更改,我只需要在一個位置更改名稱。