C# DNN在使用自定义注册表时损坏了用户名
历史 我们有一个精心设计的系统,它在多个层次上与DNN连接,用于定制用户信息。我们的用户受完全不同于DNN的数据库管理。正因为如此,我们有特殊的要求,并为我们的数据库和注册表创建了我们自己的会员提供商,以满足我们的特定需求 问题 在过去,我们使用我们的会员服务提供商和注册表格没有任何问题。最近,我们遇到了一个奇怪的情况,在有人试图注册一个新帐户后,用户名被损坏。它被破坏的方式是,用户名变成用户的区域,后跟连字符,后跟用户的完整电子邮件地址。例如,如果用户使用以下内容填写表单:C# DNN在使用自定义注册表时损坏了用户名,c#,dotnetnuke,C#,Dotnetnuke,历史 我们有一个精心设计的系统,它在多个层次上与DNN连接,用于定制用户信息。我们的用户受完全不同于DNN的数据库管理。正因为如此,我们有特殊的要求,并为我们的数据库和注册表创建了我们自己的会员提供商,以满足我们的特定需求 问题 在过去,我们使用我们的会员服务提供商和注册表格没有任何问题。最近,我们遇到了一个奇怪的情况,在有人试图注册一个新帐户后,用户名被损坏。它被破坏的方式是,用户名变成用户的区域,后跟连字符,后跟用户的完整电子邮件地址。例如,如果用户使用以下内容填写表单: username:
username: user
region: CA
email: me@example.com
在调用UserController.CreateUser(user)
之前,userInfo.Username
等于“user”。但是,在调用完成后,它将是“CA”-me@example.com“用户表中创建的记录将反映此更改
使用我的自定义成员资格提供程序(调用默认的AspNetMembershipProvider)验证问题似乎与AspNetMembershipProvider的CreateUser(ref userInfo)有关
在本次调用之前,用户名是“user”,但在本次调用完成后,用户名变成“CA”-me@example.com". 调用的结果是成功
,并在数据库中创建用户。因此,这似乎不是导致问题的故障
设置
我不确定DNN上是否有可能导致此问题的设置。在我的开发环境中,这一切都不是问题。它仅在实时和辅助内部测试环境中发生。由于我无法在调试环境中重现此错误,我认为这可能是一个站点配置问题。我在“站点设置”中找到的唯一选项是使用户名与电子邮件地址相同,但这是禁用的
我将发布用于更新DNN记录的membeship提供程序代码,并发布在注册模块中创建用户的代码。我不知道是否有人需要额外的代码,但我愿意在必要时提供更多
会员资格提供商
/// <summary>
/// Updates the user in the DNN database.
/// </summary>
/// <param name="userInfo"></param>
private void UpdateDnn(UserInfo userInfo)
{
// _defaultProvider is an instance of AspNetMembershipProvider
if (_defaultProvider.GetUser(userInfo.PortalID, userInfo.UserID) != null)
_defaultProvider.UpdateUser(userInfo);
else
_defaultProvider.CreateUser(ref userInfo);
}
注册put.Fill()
更新
我在DDN的核心中寻找解决方案,偶然发现了这个(AspNetMembershipProvider.cs:870):
行
user.Username=service+“-”+user.Email
的格式与调用UserController.CreateUser()后收到的用户名完全相同。现在的问题是:这是我的代码还是他们的代码中的错误?我将继续深入研究这个问题,如果没有人回答,我将在了解这里发生的事情后,尝试发布这个问题的答案。此外,如果我发现这是他们代码中的一个bug,我会在DNN的bug跟踪器上发布一个bug报告,并在这里链接回bug页面。我终于发现了问题。事实证明,问题在于,在同一函数中,成员资格提供程序中发布的代码上方有一行代码:
string service = HttpContext.Current.Request.Params["state"];
这行的问题是,我通过POST传递状态
作为用户的居住状态。DNN似乎认为这是服务状态。解决方法是将POST输入参数名称从state
更改为其他名称-最好是region
,因为DNN将状态识别为区域。总而言之,这是一个简单的解决办法,但我花了很长时间才找到它。我认为DNN应该允许通过成员对象或参数的状态来更改此参数,而不是直接从请求中获取它,但在这方面,我们无法做太多事情(强烈反对修改核心源代码)
public void Fill(int portalId, UserInfo userInfo)
{
if (userInfo == null) throw new ArgumentNullException("userInfo");
userInfo.PortalID = portalId;
userInfo.FirstName = FirstName;
userInfo.LastName = LastName;
userInfo.Username = UserName;
userInfo.DisplayName = DisplayName;
userInfo.Email = Email;
userInfo.Username = UserName;
userInfo.Membership.Password = Password;
userInfo.Profile.Street = Street;
userInfo.Profile.Unit = SuiteApt;
userInfo.Profile.Region = State;
userInfo.Profile.City = City;
userInfo.Profile.PostalCode = Zip;
userInfo.Profile.Telephone = PrimaryPhone;
}
// Check that the OAuth service currently being used for login is the same as was previously used (this should always be true if user authenticated to userid)
if (authUser == null || authUser.AuthenticationType.Equals(service, StringComparison.OrdinalIgnoreCase))
{
isOAuthUser = true;
//DNN-4133 Change username to email address to ensure multiple users with the same email prefix, but different email domains can authenticate
user.Username = service + "-" + user.Email;
}
else
{
createStatus = UserCreateStatus.DuplicateEmail;
}
string service = HttpContext.Current.Request.Params["state"];