ASP.NET Active Directory成员资格提供程序和SQL Profile Provider

时间:2009-05-21 20:36:52

标签: asp.net active-directory membership provider

我目前正在为我正在开展的新项目设计会员/个人资料计划,我希望得到其他人的一些意见。

该项目是一个ASP.NET Web应用程序,由于时间短,我试图使用任何和所有内置的.NET框架组件。该网站可能会娱乐< 5000个用户。每个用户都有一个配置文件,其中访问之间将保留自定义设置和对象。

我需要使用现有的Active Directory进行身份验证。由于无法扩展AD模式以保存新字段,因此我需要将用户设置和对象保存在不同的数据存储中。我也被告知ADAM可能不是一个可能的解决方案。

我希望将Active Directory成员资格提供程序用于我的身份验证方案,将SQL配置文件提供程序用作用户配置文件数据存储。我不想建立自定义配置文件提供程序,但如果需要,我不认为这会带来很多问题。

我想知道这是否是一个可能的解决方案,如果是的话,有没有人对这种方法有任何好运。

非常感谢任何评论。

感谢。

4 个答案:

答案 0 :(得分:15)

首先 - 我自己从未这样做过。

Scott Mitchell在4 Guys from Rolla处对ASP.NET 2.0成员资格,角色和配置文件提供程序系统的整个主题进行了非常出色的系列(14 !!部分)。

根据我的理解,您应该能够通过在web.config中基本使用这两个部分来配置您正在寻找的这种行为:

  <!-- configure Active Directory membership provider -->
  <membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
    <providers>
      <add name="AspNetActiveDirectoryMembershipProvider"
           type="System.Web.Security.ActiveDirectoryMembershipProvider, 
                 System.Web, Version=2.0.3600, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a" />
    </providers>
  </membership>

  <!-- configure SQL-based profile provider -->      
  <profile defaultProvider="SqlProvider">
    <providers>
      <add name="SqlProvider"
        type="System.Web.Profile.SqlProfileProvider"
        connectionStringName="SqlProfileProviderConnection"
        applicationName="YourApplication" />
    </providers>

    <!-- specify any additional properties to store in the profile -->   
    <properties>
      <add name="ZipCode" />
      <add name="CityAndState" />
    </properties>
  </profile>

我认为这应该有效: - )

答案 1 :(得分:3)

除此之外,Marc回复道:

<add name="AspNetActiveDirectoryMembershipProvider"
           type="System.Web.Security.ActiveDirectoryMembershipProvider, 
                 System.Web, Version=2.0.3600, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a" />

您可能还需要添加

connectionStringName="ADService",
attributeMapUsername="sAMAccountName"

带有对应的连接字符串

<connectionStrings>
    <add name="ADService" connectionString="LDAP://ServerIP" />
</connectionStrings>

如果您使用的是.net 4.0,则需要替换

Version=2.0.3600 

Version=4.0.0.0

最后,

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">
      <providers>
        <add name="AspNetActiveDirectoryMembershipProvider"
             connectionStringName="ADService"
             type="System.Web.Security.ActiveDirectoryMembershipProvider, 
                 System.Web, Version=4.0.0.0, Culture=neutral, 
                 PublicKeyToken=b03f5f7f11d50a3a"
             attributeMapUsername="sAMAccountName"/>
      </providers>
    </membership>

由于它被设置为默认值,因此可以引用为:

MembershipProvider provider = Membership.Provider; 

答案 2 :(得分:2)

感谢您提供的信息,它有很多帮助。而不是使用MembershipProvider provider = Membership.Provider;设置默认提供程序,您可以在成员资格标记中设置它。

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

我还写了一个小的方法和下载到Visual Studio Project和Source,配置为使用AspNetActiveDirectoryMembershipProvider。

ASP.NET Forms Based Authentication - using AspNetActiveDirectoryMembershipProvider

答案 3 :(得分:2)

我正在使用Visual Studio 2012并尝试以sugested方式执行,但会显示错误:

To call this method, the "Membership.Provider" property must be an instance of "ExtendedMembershipProvider".

所以我发现应该对带有MVC 4和实体框架的VS2012上的默认登录表单进行一些更改,如下所示:

在文件“AccountController.cs”

关于“public ActionResult Login(LoginModel model,string returnUrl)”

更改

    if (ModelState.IsValid && WebSecurity.Login(model.UserName, model.Password, persistCookie: model.RememberMe))

    if (ModelState.IsValid && Membership.Provider.ValidateUser(model.UserName, model.Password))

关于“public ActionResult LogOff()”

更改

    WebSecurity.Logout();

    FormsAuthentication.SignOut();

并添加以下内容:FormsAuthentication.SetAuthCookie(model.UserName,false);

    public ActionResult Login(LoginModel model, string returnUrl)
    {
        if (ModelState.IsValid && Membership.Provider.ValidateUser(model.UserName, model.Password))
        {

            FormsAuthentication.SetAuthCookie(model.UserName, false);               

            return RedirectToLocal(returnUrl);
        }

        // If we got this far, something failed, redisplay form
        ModelState.AddModelError("", "The user name or password provided is incorrect.");
        return View(model);
    }