You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Umbraco 7.7.3程序化创建用户设置密码报错,修改web.config无效求助

解决Umbraco 7.7.3后台用户创建时SavePassword抛出异常的问题

你踩了一个很容易混淆的坑——后台用户(Users)和前台成员(Members)用的是完全不同的Membership Provider!你之前修改的UmbracoMembershipProvider是给前台成员用的,后台用户对应的是UsersMembershipProvider,这就是为什么改了配置还是没用的核心原因。

第一步:修正web.config配置

找到你的web.config文件中的<membership>节点,定位到name="UsersMembershipProvider"的配置项,确保它包含allowManuallyChangingPassword="true",完整配置示例如下:

<membership defaultProvider="UmbracoMembershipProvider" userIsOnlineTimeWindow="15">
  <providers>
    <clear />
    <!-- 前台成员专属Provider -->
    <add name="UmbracoMembershipProvider" type="Umbraco.Web.Security.Providers.MembersMembershipProvider, Umbraco" ... />
    <!-- 后台用户专属Provider -->
    <add name="UsersMembershipProvider" type="Umbraco.Web.Security.Providers.UsersMembershipProvider, Umbraco" 
         enablePasswordRetrieval="false" 
         enablePasswordReset="true" 
         requiresQuestionAndAnswer="false" 
         defaultPasswordFormat="Hashed" 
         minRequiredNonalphanumericCharacters="0" 
         minRequiredPasswordLength="8" 
         useLegacyEncoding="false" 
         enableLockout="true" 
         maxInvalidPasswordAttempts="5" 
         passwordAttemptWindow="10" 
         allowManuallyChangingPassword="true" />
  </providers>
</membership>

第二步:调整代码实现

配置修正后,你有两种可靠的方式创建后台用户并设置密码:

方式一:沿用原有流程(适合已创建用户的场景)

现在配置正确后,你原来的代码里SavePassword方法应该可以正常执行了:

var user = userService.CreateUserWithIdentity(someMailAddress, someMailAddress);
user.AddGroup((UserGroup)someGroup);
user.StartMediaId = someMediaId;
user.StartContentId = SomeContentId;
userService.Save(user);
// 配置生效后,此方法不再抛出异常
userService.SavePassword(user, password);

方式二:通过MembershipProvider一键创建(更稳妥)

你也可以直接调用后台用户专属的MembershipProvider创建用户,同时完成密码设置,避免分步操作的潜在问题:

var usersProvider = Membership.Providers["UsersMembershipProvider"] as Umbraco.Web.Security.Providers.UsersMembershipProvider;
MembershipCreateStatus createStatus;
var membershipUser = usersProvider.CreateUser(
    username: someMailAddress,
    password: password,
    email: someMailAddress,
    passwordQuestion: null,
    passwordAnswer: null,
    isApproved: true,
    providerUserKey: null,
    status: out createStatus
);

if (createStatus == MembershipCreateStatus.Success)
{
    // 获取刚创建的用户,补充配置信息
    var user = userService.GetByUsername(someMailAddress);
    user.AddGroup((UserGroup)someGroup);
    user.StartMediaId = someMediaId;
    user.StartContentId = SomeContentId;
    userService.Save(user);
}
else
{
    // 处理创建失败的情况,比如抛出错误提示
    throw new Exception($"用户创建失败:{createStatus}");
}

关键注意点

  • 务必分清:后台用户用UsersMembershipProvider,前台成员用UmbracoMembershipProvider,两者配置完全独立,不要搞混。
  • 如果配置中设置了defaultPasswordFormat="Hashed"(推荐生产环境使用),Umbraco会自动帮你完成密码哈希,不需要手动处理哈希逻辑。

内容的提问来源于stack exchange,提问作者joden

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 04:30:57