sql-server – 电子邮件地址作为UserName BUG
我正在开发一个带有SQL Server数据库的MVC4网站.我想用他们的电子邮件地址注册人.
但是如果电子邮件地址包含字符i,则WebSecurity.CreateUserAndAccount方法抛出异常说:
我研究了很多,并找到了几个帖子,但没有解决方案. http://forums.asp.net/t/1862233.aspx/1?How+can+i+use+email+address+for+username+in+MVC4+Membership http://aspnetwebstack.codeplex.com/workitem/714 解决方法您的根本问题是您正在尝试输入非ASCII字符作为电子邮件地址.“ASCII字符集”将您限制为美式英文字母,这恰好是拉丁字母. 我不会说土耳其语,但正如所指出的那样 在土耳其语中,“我”是小写的,而“?”是“i”的上限. 所以你有一个字符不是EN-US ASCII字符集的成员. 如上所述,ToUpper(应该是ToUpperInvariant)是怪的,因为它在幕后将’i’更改为’?’,这不是一个有效的ASCII字符. 这是字符串/字符的ToUpper方法的常见问题. 类似的事情发生在这里与ToUpper. 您首先需要做的是确保您的用户输入ASCII字符. 所以你需要做的就是在调用成员资格方法之前,先对“输入字符串”进行拉丁/罗马化. 我有类似的问题,只有ASCII的能力的软件从第三方,失败的变音符和法语口音字符,并使用下面的方法来解决这个问题. // string str = ApertureSucks.Latinize("(??? a???aè"); public static string Latinize(string stIn) { // Special treatment for German Umlauts stIn = stIn.Replace("?","ae"); stIn = stIn.Replace("?","oe"); stIn = stIn.Replace("ü","ue"); stIn = stIn.Replace("?","Ae"); stIn = stIn.Replace("?","Oe"); stIn = stIn.Replace("ü","Ue"); // End special treatment for German Umlauts string stFormD = stIn.Normalize(System.Text.NormalizationForm.FormD); System.Text.StringBuilder sb = new System.Text.StringBuilder(); for (int ich = 0; ich < stFormD.Length; ich++) { System.Globalization.UnicodeCategory uc = System.Globalization.CharUnicodeInfo.GetUnicodeCategory(stFormD[ich]); if (uc != System.Globalization.UnicodeCategory.NonSpacingMark) { sb.Append(stFormD[ich]); } // End if (uc != System.Globalization.UnicodeCategory.NonSpacingMark) } // Next ich //return (sb.ToString().Normalize(System.Text.NormalizationForm.FormC)); return (sb.ToString().Normalize(System.Text.NormalizationForm.FormKC)); } // End Function Latinize 最后但并非最不重要的是,我不会使用内置的ASP.NET成员资格提供者,因为它通过用户名应用程序名称连接到rolename,而不是使用唯一的ID.这意味着您将无法更改用户或组/角色名称,而无需更改所有映射表. 下面的“事情”表明问题的完全愚蠢,不应该被使用 CREATE TABLE [dbo].[UsersInRoles]( [Username] [varchar](255) NOT NULL,[Rolename] [varchar](255) NOT NULL,[ApplicationName] [varchar](255) NOT NULL,CONSTRAINT [usersinroles_pkey] PRIMARY KEY CLUSTERED ( [Username] ASC,[Rolename] ASC,[ApplicationName] ASC )WITH (PAD_INDEX = OFF,STATISTICS_NORECOMPUTE = OFF,IGNORE_DUP_KEY = OFF,ALLOW_ROW_LOCKS = ON,ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] ) ON [PRIMARY] 原因如下: >问题1:字符串加入将使用户角色加入非常慢 – 非常 我相信MS提供的会员提供者的失败还有更多的问题.例如,使用快速散列算法(MD5),这是一种反模式,因为这样可以实现彩虹表的攻击,特别是如果散列不是盐渍的.如果MS成员提供者展示了一件事情,那么这就是如何设计会员提供商. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |