C# DNN在使用自定义注册表时损坏了用户名

C# DNN在使用自定义注册表时损坏了用户名,c#,dotnetnuke,C#,Dotnetnuke,历史 我们有一个精心设计的系统,它在多个层次上与DNN连接,用于定制用户信息。我们的用户受完全不同于DNN的数据库管理。正因为如此,我们有特殊的要求,并为我们的数据库和注册表创建了我们自己的会员提供商,以满足我们的特定需求 问题 在过去,我们使用我们的会员服务提供商和注册表格没有任何问题。最近,我们遇到了一个奇怪的情况,在有人试图注册一个新帐户后,用户名被损坏。它被破坏的方式是,用户名变成用户的区域,后跟连字符,后跟用户的完整电子邮件地址。例如,如果用户使用以下内容填写表单: username:

历史

我们有一个精心设计的系统,它在多个层次上与DNN连接,用于定制用户信息。我们的用户受完全不同于DNN的数据库管理。正因为如此,我们有特殊的要求,并为我们的数据库和注册表创建了我们自己的会员提供商,以满足我们的特定需求

问题

在过去,我们使用我们的会员服务提供商和注册表格没有任何问题。最近,我们遇到了一个奇怪的情况,在有人试图注册一个新帐户后,用户名被损坏。它被破坏的方式是,用户名变成用户的区域,后跟连字符,后跟用户的完整电子邮件地址。例如,如果用户使用以下内容填写表单:

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"];