2011-11-24 92 views
3

對不起,如果之前已詢問過此問題,但我已搜索Google和此網站,但無法找到針對初學者的完整工作。我試圖編寫一個登錄頁面,使用ASP.NET 2對活動目錄組進行身份驗證。我發現了各種文章,但他們似乎都缺乏新手的關鍵信息。我設法拼湊了一個登錄頁面,它可以與幾個活動目錄登錄一起工作,但我無法將其限制爲僅限屬於特定活動目錄組成員的用戶。 我的web.config包含以下內容:使用ASP.NET 2中的活動目錄組登錄表單

<connectionStrings> 
     <add name="ADConnectionString" connectionString="LDAP://domainname.local/DC=domainname,DC=local" /> 
     </connectionStrings> 
      <authentication mode="Forms"> 
       <forms 
        loginUrl="Login.aspx" 
        name=".ADAuthCookie" timeout="1000" /> 
      </authentication> 
      <authorization> 
       <allow roles="DOMAINNAME\group"/> 
       <deny users="?"/> 
      </authorization> 
      <membership defaultProvider="MyADMembershipProvider"> 
      <providers> 
       <add name="MyADMembershipProvider" 
       type="System.Web.Security.ActiveDirectoryMembershipProvider, 
      System.Web, Version=2.0.0.0, Culture=neutral, 
      PublicKeyToken=b03f5f7f11d50a3a" 
       connectionStringName="ADConnectionString" 
       attributeMapUsername="sAMAccountName"/> 
      </providers> 
      </membership> 

我有匿名的真實域名,但我相信這部分工作,它讓我登陸,如果我使用:

<allow roles="DOMAINNAME\username"/> 
<deny users="?"/> 

的其餘部分項目由具有WebControls.Login控制和在Page_Load函數以下一個Default.aspx頁面一個頁面的Login.aspx的證明登錄已工作:

Response.Write("Hello, " + Server.HtmlEncode(User.Identity.Name)); 

我已經試過

<allow roles="DOMAINNAME\group"/> 
<deny users="*"/> 

但這似乎否認每個人。

我錯過了什麼?

+0

下面的文章將描述你在找什麼? http://msdn.microsoft.com/en-us/library/ff649227.aspx –

+0

感謝文章@ miika-l,它仍然有一些差距 - 我已經設法克服大部分但仍然不能瞭解如何只允許訪問指定活動目錄組中的用戶。看起來我應該可以從web.config中的節點或通過在Application_AuthenticateRequest函數中迭代組列表來完成它,但我不知道如何執行。任何指針? 我也嘗試了ASP.NET 2版本的文章http://msdn.microsoft.com/en-us/library/ff650308.aspx但有類似的問題。 – nigelhooper

+0

在第四步中,他們構建了用戶所屬的所有組的字符串。因此,您可以修改此函數以搜索您正在查找的組,或者只搜索該函數返回的字符串,就像它在doc中一樣(「GetGroups方法將返回組列表作爲管道分隔字符串」) 。這個方法與web.config設置沒有任何關係,但是,如果你真的設置了這個方法? –

回答

0

從我可以告訴web.config的授權部分不像ActiveDirectoryMembershipProvider那樣工作。看起來你需要在代碼中檢查角色/組的成員身份。

我花了幾天最近研究你正在嘗試什麼,沒有找到任何東西。最終實現我們自己的AD登錄模塊以獲得所需的行爲。如果您決定實施您自己的解決方案,我會建議使用ActiveDirectoryMembershipProvider進行身份驗證。然後只需自己處理授權。

0

嘗試在你的web.config文件這個變化

<configuration> 

    <configSections> 

<section name="loginRedirectByRole" type="dirrerentloginusers.LoginRedirectByRoleSection" allowLocation="true" allowDefinition="Everywhere" /> 

<loginRedirectByRole> 
    <roleRedirects> 
    <add role="Manager" url="/Manager/ManagerPage.aspx" /> 
    <add role="User" url="/User/UserPage.aspx" /> 
</roleRedirects> 

<system.web> 
    <authentication> 
    <forms loginUrl="LoginForm1.aspx" protection="All"></forms> 
    </authentication> 
    <roleManager enabled="true"></roleManager> 
    <compilation debug="true" targetFramework="4.0" /> 
</system.web> 

創建一個類logintype

public class LoginRedirectByRoleSection : ConfigurationSection 
{ 
    [ConfigurationProperty("roleRedirects")] 
    public RoleRedirectCollection RoleRedirects 
    { 
     get 
     { 
      return (RoleRedirectCollection)this["roleRedirects"]; 
     } 
     set 
     { 
      this["roleRedirects"] = value; 
     } 
    } 
} 

public class RoleRedirectCollection : ConfigurationElementCollection 
{ 
    public RoleRedirect this[int index] 
    { 
     get 
     { 
      return (RoleRedirect)BaseGet(index); 
     } 
    } 

    public RoleRedirect this[object key] 
    { 
     get 
     { 
      return (RoleRedirect)BaseGet(key); 
     } 
    } 

    protected override ConfigurationElement CreateNewElement() 
    { 
     return new RoleRedirect(); 
    } 

    protected override object GetElementKey(ConfigurationElement element) 
    { 
     return ((RoleRedirect)element).Role; 
    } 
} 

public class RoleRedirect : ConfigurationElement 
{ 
    [ConfigurationProperty("role", IsRequired = true)] 
    public string Role 
    { 
     get 
     { 
      return (string)this["role"]; 
     } 
     set 
     { 
      this["role"] = value; 
     } 
    } 

    [ConfigurationProperty("url", IsRequired = true)] 
    public string Url 
    { 
     get 
     { 
      return (string)this["url"]; 
     } 
     set 
     { 
      this["url"] = value; 
     } 
    } 
} 

然後在頁面背後的代碼添加以下代碼並且將用戶重定向到他的頁面

   private void RedirectLogin(string username) 
    { 
     LoginRedirectByRoleSection roleRedirectSection = (LoginRedirectByRoleSection)ConfigurationManager.GetSection("loginRedirectByRole"); 
     foreach (RoleRedirect roleRedirect in roleRedirectSection.RoleRedirects) 
     { 
      if (Roles.IsUserInRole(username,roleRedirect.Role)) 
      { 
       // Response.Redirect(roleRedirect.Url); 
       FormsAuthentication.RedirectFromLoginPage(username,true); 
       Response.Redirect(roleRedirect.Url); 
      } 
     } 
    } 
0

我沒有看到任何RoleProvider在您發佈的web.config文件。如果您想將Windows組成員身份用作ASP.NET角色,我會認爲您需要WindowsTokenRoleProvider