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
相关产品推荐
相关产品推荐

