【问题标题】:ASP.NET MVC membership - wrong username casing usedASP.NET MVC 成员资格 - 使用了错误的用户名大小写
【发布时间】:2010-07-22 19:19:47
【问题描述】:

当用户在 ASP.NET MVC 项目中使用会员服务的默认实现登录时,他们会使用登录时使用的任何大小写的用户名登录。

例如,我创建了一个名为 John 的用户。如果我随后以 joHN 身份登录,则 User.Identity.Name 将等于 joHN。我希望它等于实际用户的登录名 John。

目前我的情况是这样的:

var membershipUser = Membership.GetUser(model.UserName);
var membershipUserName = Membership.GetUserNameByEmail(membershipUser .Email);
FormsService.SignIn(membershipUserName, model.RememberMe);

代替默认实现:

FormsService.SignIn(model.UserName, model.RememberMe);

好像有点绕。有没有更好的方法来做到这一点?

【问题讨论】:

  • 以用户输入的方式显示登录名有什么问题?
  • 用户名稍后在区分大小写的系统中使用。所以当它看到 joHN 时,并没有意识到它和 John 是同一个用户。

标签: asp.net-mvc asp.net-membership


【解决方案1】:

在整个提供程序堆栈中用户名不区分大小写,并且主体设置为用于身份验证的任何值。

如果您需要强制区分大小写,则需要保护您描述的所有身份验证点或实施自定义主体/身份。

我强烈推荐第一个,如果你选择第二个,我会为你祈祷。 ;-)

祝你好运。

【讨论】:

  • 为此祈祷似乎有点极端,快到周末了——别忘了放轻松,伙计:)
  • 我不可能选择后一种选择!谢谢。
【解决方案2】:

您总是可以只执行您自己的案件。就像这些是人们的真实姓名(即使是一些奇怪的名字),你可以这样做:

 TextInfo culture = new CultureInfo("en-US", false).TextInfo;
  FormsService.SignIn(culture.ToTitleCase(model.UserName), model.RememberMe);

并使其成为标题大小写。当然,这不是您要求的 100%,但它可能比您当前的解决方案更好(因为这至少节省了对数据库的调用)。

【讨论】:

  • ToTitleCase,有趣 - 不知道那个方法。
猜你喜欢
  • 1970-01-01
  • 2012-09-07
  • 1970-01-01
  • 1970-01-01
  • 2013-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多