显示原始Sitecore用户名,而不是当前输入的用户名

时间:2011-01-24 15:10:41

标签: c# asp.net sitecore case-insensitive username

我可能会忽略这里显而易见的事情,但是可以使用注册时使用的大小写中的用户名返回Sitecore用户吗?

目前,用户名将显示为用户登录时输入的内容,但我希望能够获取原始字符串。

我正在使用User user = User.FromName(domainUser, false);

更新 这是我在Yan的出色答案之后得到的结论:

// get the MembershipUser object normally by name
var initialUser = Membership.GetUser(domainUser, false);
if (initialUser != null)
{
    // get the same MembershipUser by Id - in this case it retuns username in correct case
    initialUser = Membership.GetUser(initialUser.ProviderUserKey, false);
}

// get the Sitecore user from the username in correct case
Sitecore.Security.Accounts.User user = Sitecore.Security.Accounts.User.FromName(initialUser.UserName, false);

谢谢,

Annelie

1 个答案:

答案 0 :(得分:5)

这是一个有趣的问题,深入挖掘这个问题很有趣。

您提到的代码行实际上并没有转到安全数据库来获取用户。它只会使用您提供的名称创建一个User对象。

您可以参考较低级别的ASP.NET类System.Web.Security.Membership。它包含方法GetUser,该方法多次重载。诀窍在于,其接受用户名作为参数的重载版本与User.FromName的行为相同。我的意思是它不会从基础SQL表返回实际的UserName,而是使用您在参数中传递给GetUser方法的用户名。它仍然可以正常工作 - 所有比较都以小写形式完成。

因此,如果您需要获得用户名的真实案例,则可以使用实际查询UserName字段的基础SQL源的方法之一。例如,GetUser(object, bool),它通过UserId获取用户:

  // get the MembershipUser object normally by name
  var user =  Membership.GetUser(@"sitecore\admin", false);
  if (user != null)
  {
    // get the same MembershipUser by Id - in this case it retuns username in correct case
    user = Membership.GetUser(user.ProviderUserKey, false);
    // use the user.UserName value as you wish
    Response.Write(user.UserName);
  }

正如您所看到的,它是对数据库的2次调用,而不是Membership.GetUser(username)的1次调用,而User.FromName(username)则是0。

或者,如果您确定用户已收到电子邮件,并且您知道此电子邮件,则可以使用Membership.GetUserNameByEmail(email)方法。