我目前正在为我正在开展的新项目设计会员/个人资料计划,我希望得到其他人的一些意见。
该项目是一个ASP.NET Web应用程序,由于时间短,我试图使用任何和所有内置的.NET框架组件。该网站可能会娱乐< 5000个用户。每个用户都有一个配置文件,其中访问之间将保留自定义设置和对象。
我需要使用现有的Active Directory进行身份验证。由于无法扩展AD模式以保存新字段,因此我需要将用户设置和对象保存在不同的数据存储中。我也被告知ADAM可能不是一个可能的解决方案。
我希望将Active Directory成员资格提供程序用于我的身份验证方案,将SQL配置文件提供程序用作用户配置文件数据存储。我不想建立自定义配置文件提供程序,但如果需要,我不认为这会带来很多问题。
我想知道这是否是一个可能的解决方案,如果是的话,有没有人对这种方法有任何好运。
非常感谢任何评论。
感谢。
答案 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);
}