17

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

该项目是一个 ASP.NET Web 应用程序,由于时间短,我正在尝试使用所有内置的 .NET 框架组件。该网站可能会招待 < 5000 名用户。每个用户都有一个配置文件,其中自定义设置和对象将在访问之间保持不变。

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

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

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

任何意见将不胜感激。

谢谢。

4

4 回答 4

16

First off - I've never done this myself.

There's a really excellent series (14 !! parts) on the whole topic of ASP.NET 2.0 membership, roles and profile provider systems by Scott Mitchell at 4 Guys from Rolla.

According to my understanding, you should be able to configure this behavior you are looking for by using basically these two sections in your 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>

I would think this ought to work :-)

于 2009-05-21T21:15:21.377 回答
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; 
于 2011-03-25T17:41:09.017 回答
2

我正在使用 Visual Studio 2012 并尝试按照建议进行操作,但显示错误:

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

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

在文件“AccountController.cs”上

关于“公共 ActionResult 登录(LoginModel 模型,字符串 returnUrl)”

更改

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

为了

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

在“公共 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);
    }
于 2013-06-17T11:36:07.573 回答
2

感谢您的信息,它有很大帮助。MembershipProvider provider = Membership.Provider; 此外,您可以在成员标签中设置它,而不是设置默认提供者 。

<membership defaultProvider="AspNetActiveDirectoryMembershipProvider">

我还写了一个小方法并下载到配置为使用 AspNetActiveDirectoryMembershipProvider 的 Visual Studio 项目和源。

基于 ASP.NET 表单的身份验证 - 使用 AspNetActiveDirectoryMembershipProvider

于 2011-04-25T15:18:33.200 回答