ann*_*lie 0 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);
Run Code Online (Sandbox Code Playgroud)
谢谢,
Annelie
这是一个有趣的问题,深入挖掘这个问题很有趣.
您提到的代码行实际上并没有转到安全数据库来获取用户.它仅使用您提供的名称创建User对象.
您可以参考较低级别的ASP.NET类System.Web.Security.Membership.它包含GetUser多次重载的方法.诀窍是它接受用户名作为参数的重载版本的行为与User.FromName.我的意思是它不会UserName从底层SQL表返回实际值,而是使用您在参数中传递给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);
}
Run Code Online (Sandbox Code Playgroud)
正如您所看到的,它是对数据库的2次调用,而不是1次,Membership.GetUser(username)而不是0 User.FromName(username).
或者,如果您确定用户已收到电子邮件,并且您知道此电子邮件,则可以使用Membership.GetUserNameByEmail(email)方法.