【问题标题】:AspNetSqlMembershipProvider is used instead of ActiveDirectoryMembershipProvider in mvc 4 application在 mvc 4 应用程序中使用 AspNetSqlMembershipProvider 代替 ActiveDirectoryMembershipProvider
【发布时间】:2013-07-30 07:17:22
【问题描述】:

我想在 mvc 4 应用程序中实现一个简单的 AD 身份验证。这是我在 web.config 文件中所做的更改:

<connectionStrings>
    <add name="ADConnectionString" connectionString="LDAP://test.com:636/DC=test,DC=com"/>
</connectionStrings>
...
<membership defaultProvider="ADMembershipProvider">
      <providers>
        <clear/>
        <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider" connectionStringName="ADConnectionString" attributeMapUsername="sAMAccountName"/>
      </providers>

这是我的服务类中使用 AD 身份验证的方法:

public bool Authentificate(string userName, string password)
{
     var membershipSection = (MembershipSection)WebConfigurationManager.GetSection("system.web/membership");

     string defaultProvider = membershipSection.DefaultProvider;

     MembershipProvider provider = Membership.Providers[defaultProvider];

     return provider != null && provider.ValidateUser(userName, password);
}

但是当我调试我的应用程序时,我看到“defaultProvider”是“AspNetSqlMembershipProvider”而不是“ActiveDirectoryMembershipProvider”,并且身份验证失败并显示消息:

无法连接到 SQL Server 数据库。在 System.Web.Management.SqlServices.GetSqlConnection(字符串服务器, 字符串用户、字符串密码、布尔值信任、字符串 连接字符串)在 System.Web.Management.SqlServices.SetupApplicationServices(字符串 服务器,字符串用户,字符串密码,布尔值信任,字符串 连接字符串、字符串数据库、字符串 dbFileName、SqlFeatures 功能,布尔安装)在 System.Web.DataAccess.SqlConnectionHelper.CreateMdfFile(字符串 fullFileName,字符串数据目录,字符串连接字符串)

这里有什么问题?

【问题讨论】:

  • 似乎由于某种原因配置不是从 web.config 加载,而是从 machine.config 文件加载。你能分享一些关于你的解决方案结构的信息吗?该服务类在哪里定义,如何以及在哪里调用?
  • @Andrei 你好!我有以下解决方案结构(6 个项目): MyProject.Data MyProject.Domain MyProject.Infrastructure MyProject.Presentation MyProject.Tests MyProject.Web web.config 位于 . Web 项目根目录。 Authentificate() 方法的服务类位于 .Domain 项目中。此方法是从 .Presentation 项目中的控制器类调用的。控制器正在使用来自 **.Web 项目的视图。如果需要,我可以添加任何其他信息。
  • 应用程序的入口点在哪里?它是在 .Web.Presentation 项目中,还是在其他地方?
  • @Andrei 在 .Presentation,类 Application,方法:protected void Application_Start() { WebApiConfig.Register(GlobalConfiguration.Configuration); FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); RouteConfig.RegisterRoutes(RouteTable.Routes); BundleConfig.RegisterBundles(BundleTable.Bundles); }

标签: c# asp.net-mvc


【解决方案1】:

当一个 .Net 应用程序启动时,它会从相应的配置文件中设置域设置。对于在 IIS 上运行的 Web 应用程序,这是 web.condig,对于可执行文件 - app.config 实际上已重命名为 executable_name.exe.config。如果没有找到这样的文件 - 来自machine.config 的设置正在被拾取。这里重要的一点是,一个域中的所有程序集都使用相同的设置 - 与入口点程序集相关联的设置。并且不考虑其他设置!

在您的情况下,即使 Web 项目有一个 web.config 文件,入口点是 Presentation 项目,因此基本上不会以任何方式使用 web.config 设置。这里最简单的解决方法是为 Presentation 项目定义app.config,并在其中包含所有必要的设置(如提供程序)。

【讨论】:

  • 我在 .Presentation 和 .Domain 项目中添加了相同的 web.config,但没有任何改变(我得到了同样的例外。
  • @user2598794,你加了web.config,还是app.configweb.config 仅适用于 Web 项目,而 app.config 适用于可执行文件(另请注意,app.config 在构建后重命名,因此在输出目录中您将有类似 myproject.presentation.exe.config 的内容。
  • @user2598794,那么我必须承认我需要更多信息。 Presentation 项目是什么?它是可执行文件,还是 dll,还是其他任何东西?它是如何运行的?
  • 所有项目都是'ClassLibrary',我照常运行它们:Ctrl-F5。
  • @user2598794,至少其中一个(最有可能是Presentation)应该是Console Application,否则没有什么可运行的。
猜你喜欢
  • 1970-01-01
  • 2017-08-27
  • 2010-10-19
  • 2017-03-22
  • 1970-01-01
  • 2014-09-13
  • 1970-01-01
  • 2012-12-17
  • 1970-01-01
相关资源
最近更新 更多