我能够自己解决问题。我重新配置了 umbracosUsersMembershipProvider
以满足我的密码强度要求,如下所示:
<add name="UsersMembershipProvider"
type="Umbraco.Web.Security.Providers.UsersMembershipProvider, Umbraco"
passwordStrengthRegularExpression="^.*(?=.{8,20})(?=.*[a-z])(?=.*[A-Z])(?=.*[_\W])(?=.*[\d]).*$"
minRequiredNonalphanumericCharacters="0"
minRequiredPasswordLength="4"
...
/>
使用 umbraco 后端(web 界面)创建用户时,umbraco.userTasks.Save()
会在内部调用。这用于Umbraco.Core.Security.MembershipProviderExtensions.GetUsersMembershipProvider()
获取 web.config 文件中定义的 MembershipProvider。然后它使用标准的 .Net 方法生成一个随机密码GeneratePassword
:
Membership.GeneratePassword(usersMembershipProvider.MinRequiredPasswordLength, usersMembershipProvider.MinRequiredNonAlphanumericCharacters)
因为我没有更改和的默认值MinRequiredPasswordLength
-MinRequiredNonAlphanumericCharacters
独立passwordStrengthRegularExpression
于这两个 - 无法创建新用户,因为无法设置密码。即使将参数更改为8
并且1
我无法确定每次都会生成与我的表达式匹配的密码,这就是为什么我需要将我的正则表达式更改为一个不太安全的密码:
^.*(?=.{8,20})(?=.*[a-zA-Z])(?=.*[_\W]).*$
不幸的是,我没有看到任何改变这一点的选项,因为这种创建用户的机制已深度集成到 umbraco 中。此外,我不明白为什么没有记录异常,因为创建用户的代码似乎记录了异常:
catch (Exception exception)
{
LogHelper.Error<userTasks>(string.Format("Failed to create the user. Error from provider: {0}", providerError.ToString()), exception);
return false;
}
即使我能够解决我的问题,我认为 umbraco 的行为和架构在这部分中是非常不透明的。我一直能够使用 umbracos 自己的方法创建一个新的后端用户,因为它们不像 MembershipProvider 那样进行密码复杂性检查。不应该有不同的方法来做同样的事情,因为如果遇到任何问题都很难调试。