使用ASP.NET 2中的Active Directory组登录表单

时间:2011-11-24 09:57:03

标签: c# asp.net active-directory web-config asp.net-2.0

很抱歉,如果之前已经提出此问题,但我搜索了Google和此网站,但无法通过针对初学者找到完整的作品。我正在尝试编写一个使用ASP.NET 2对活动目录组进行身份验证的登录页面。我发现了各种文章,但它们似乎都缺乏新手的关键信息。我已经设法将一个登录页面拼凑在一起,该登录页面可以处理几个活动目录登录,但我不能将其限制为仅作为特定活动目录组成员的用户。 我的web.config包含以下内容:

    <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控件的Login.aspx页面和一个带有以下page_load函数的Default.aspx页面,以证明登录已经有效:

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

我试过了

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

但这似乎否认了所有人。

我错过了什么?

3 个答案:

答案 0 :(得分:0)

据我所知,web.config的Authorization部分不能像ActiveDirectoryMembershipProvider那样工作。您似乎需要在代码中检查角色/组访问权限。

我最近花了几天时间研究你在尝试什么,但没有发现任何东西。结束实现我们自己的AD登录模块以获得所需的行为。如果您决定实施自己的解决方案,我建议您使用ActiveDirectoryMembershipProvider进行身份验证。然后自己处理授权。

答案 1 :(得分: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);
            }
        }
    }

答案 2 :(得分:0)

我在您发布的web.config文件中看不到任何RoleProvider。如果您想将Windows组成员身份用作ASP.NET角色,我认为您需要WindowsTokenRoleProvider