Форма входа с использованием групп Active Directory в ASP.NET 2 - PullRequest
3 голосов
/ 24 ноября 2011

Извините, если раньше об этом спрашивали, но я искал и 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="?"/>

Остальная часть проекта состоит из страницы Login.aspx с элементом управления WebControls.Login и страницы Default.aspx со следующим в функции page_load, чтобы доказать, что вход в систему работал:

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

Я пытался

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

Но это, похоже, отрицает всех.

Что мне не хватает?

Ответы [ 3 ]

0 голосов
/ 23 февраля 2012

Попробуйте внести изменения в файл 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 голосов
/ 23 февраля 2012

Я не вижу RoleProvider в файле web.config, который вы разместили. Я бы подумал, что вам понадобится WindowsTokenRoleProvider , если вы хотите использовать членство в группе Windows в качестве ролей ASP.NET.

0 голосов
/ 29 ноября 2011

Из того, что я могу сказать, раздел авторизации web.config не работает так же для ActiveDirectoryMembershipProvider.Кажется, вам нужно будет проверить роль / групповое членство в коде.

Я провел пару дней, исследуя то, что вы пытаетесь, и ничего не нашел.Закончил реализацию нашего собственного модуля AD входа в систему, чтобы получить желаемое поведение.Если вы решите реализовать собственное решение, я бы порекомендовал использовать ActiveDirectoryMembershipProvider для аутентификации.Тогда просто обработайте авторизацию самостоятельно.

...