【问题标题】:Umbraco not authenticating against Active DirectoryUmbraco 未针对 Active Directory 进行身份验证
【发布时间】:2015-08-18 18:31:01
【问题描述】:

我正在为以下配置创建一个互联网站点: - 公共网站 - 用户需要再次验证活动目录 - 角色由第 3 方 ERP 系统提供服务,也使用 AD 进行身份验证

我做了什么 因此,我尝试按照本指南 (https://our.umbraco.org/wiki/how-tos/membership-providers/active-directory-membership-provider) 进行身份验证,并为 ERP 角色编写了自定义角色提供程序。我为登录表单使用了内置模板。

角色部分工作得很好。身份验证没有。

问题 似乎 Umbraco 仍在使用 UmbracoMembershipProvider。当我在 umbraco 中创建成员时,我可以使用 umbraco 凭据登录。当我尝试任何 AD 帐户时,它不会进行身份验证。

我试过了 更改 LDAP 连接字符串以使用不存在的 OU 或 CN。它给了我错误,因此在过程中的某个地方建立了与 AD 的连接。

我也试过 RB.ActiveDirectoryProviders。结果一样。

我没有抛出任何异常,只是“用户名或密码无效”。日志说:

2015-08-19 08:45:20,764 [126] INFO  Umbraco.Core.Security.UmbracoMembershipProviderBase - [P6460/T133/D8] Login attempt failed for username nico from IP address ::1, the user does not exist

我最好的猜测是我犯了一些配置错误。

那么我如何将 Active Directory 用作唯一的 MembershipProvider?

欢迎任何帮助。

我的设置

带有 iis/umbraco/VS2012 的本地机器运行带有 AD 的虚拟 PC。我在 Visual Studio/IISExpress 中运行 Umbraco 7.2.8。我使用了 Umbraco 的 Nuget 包。

web.config

<connectionStrings>
   <add name="ADConnectionString" connectionString="LDAP://192.168.2.50/dc=XXX,dc=YYY" />
</connectionStrings> 

<membership defaultProvider="ADMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <add name="UmbracoMembershipProvider" type="Umbraco.Web.Security.Providers.MembersMembershipProvider, Umbraco" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="4" useLegacyEncoding="true" enablePasswordRetrieval="false" enablePasswordReset="true"
    requiresQuestionAndAnswer="false" defaultMemberTypeAlias="Member" passwordFormat="Hashed" />
    <add name="UsersMembershipProvider" type="Umbraco.Web.Security.Providers.UsersMembershipProvider, Umbraco" minRequiredNonalphanumericCharacters="0" minRequiredPasswordLength="4" useLegacyEncoding="true" enablePasswordRetrieval="false" enablePasswordReset="true"
    requiresQuestionAndAnswer="false" passwordFormat="Hashed" />
    <add name="ADMembershipProvider" type="System.Web.Security.ActiveDirectoryMembershipProvider, System.Web, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a" connectionStringName="ADConnectionString" connectionUsername="[USER]" connectionPassword="[PASSWORD]"
    attributeMapUsername="sAMAccountName" />
  </providers>
</membership>




@using (Html.BeginUmbracoForm<UmbLoginController>("HandleLogin"))
{
    <fieldset>
        <legend>Login</legend>
        
        @Html.ValidationSummary("loginModel", true)

        @Html.LabelFor(m => loginModel.Username)
        @Html.TextBoxFor(m => loginModel.Username)
        @Html.ValidationMessageFor(m => loginModel.Username)
        <br />

        @Html.LabelFor(m => loginModel.Password)
        @Html.PasswordFor(m => loginModel.Password)
        @Html.ValidationMessageFor(m => loginModel.Password)
        <br />

        <button>Login</button>
    </fieldset>  
}

【问题讨论】:

    标签: authentication active-directory umbraco umbraco7


    【解决方案1】:

    经过数小时的搜索,我终于解决了这个问题。似乎 UmbLoginController 总是使用 UmbracoMembershipProvider。这在我看来是不透明的。

    无论如何,我创建了一个新的表面控制器,就像提到的 here 一样,现在一切正常。

    【讨论】:

    • 好吧,事实证明这个答案根本不起作用,正如我在使用该网站时注意到的那样:S。提供的 AD 需要具有名称“UsersMembershipProvider”。所以你需要替换原来的行。