内置帮助器将 User.Identity.Name 解析为 Domain\Username
Posted
技术标签:
【中文标题】内置帮助器将 User.Identity.Name 解析为 Domain\\Username【英文标题】:Built-in helper to parse User.Identity.Name into Domain\Username内置帮助器将 User.Identity.Name 解析为 Domain\Username 【发布时间】:2010-09-25 20:36:00 【问题描述】:是否有任何内置实用程序或帮助程序来解析 HttpContext.Current.User.Identity.Name
,例如domain\user
如果存在的话单独获取域名和用户?
或者还有其他类可以这样做吗?
我知道拨打String.Split("\")
很容易,但很有趣
【问题讨论】:
这是我们总是忘记问自己的简单问题。期待这个问题的任何有用答案。 【参考方案1】:这更好(更容易使用,没有机会NullReferenceExcpetion
并且符合 MS 编码准则关于平等对待空字符串和空字符串):
public static class Extensions
public static string GetDomain(this IIdentity identity)
string s = identity.Name;
int stop = s.IndexOf("\\");
return (stop > -1) ? s.Substring(0, stop) : string.Empty;
public static string GetLogin(this IIdentity identity)
string s = identity.Name;
int stop = s.IndexOf("\\");
return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : string.Empty;
用法:
IIdentity id = HttpContext.Current.User.Identity;
id.GetLogin();
id.GetDomain();
这需要 C# 3.0 编译器(或更新版本),编译后不需要 3.0 .Net。
【讨论】:
你在GetLogin
的return语句可以简化为return s.Substring(stop + 1);
如果用户名有多个反斜杠怎么办?如果用户想使用 user@domain.com 的 UPN 格式怎么办?我最终使用了 Win32 函数 CredUIParseUserName。见pinvoke.net/default.aspx/credui.creduiparseusername【参考方案2】:
System.Environment.UserDomainName
只给你域名
同样,System.Environment.UserName
只为您提供用户名
【讨论】:
> System.Environment.UserDomainName` 只给你域名 >> 同样,System.Environment.UserName
只给你用户名 这在 ASP.NET 上不起作用
我认为如果您使用 authentication=Windows 和 impersonation=true,它会起作用。见 - ***.com/questions/8841816/…【参考方案3】:
var components = User.Identity.Name.Split('\\');
var userName = components.Last()
var domainName = components.Reverse().Skip(1).FirstOrDefault()
【讨论】:
【参考方案4】:你们也可以考虑解析像“user@company.com”或“user@domain”这样的字符串输入。
这就是我目前正在做的事情: 如果字符串包含“\”,则在“\”处拆分字符串并提取用户名和域 否则,如果字符串包含“@”,则在“@”处拆分字符串并提取用户名和域 否则将字符串视为没有域的用户名
在输入字符串不是易于预测的格式(即“域\用户@域”)的情况下,我仍在寻找更好的解决方案。我在想正则表达式...
更新:我的立场已得到纠正。我的回答有点脱离上下文,它指的是从用户输入中解析用户名和域的一般情况,比如在用户登录/登录提示中。希望它仍然可以帮助某人。
【讨论】:
需要一个优雅的解决方案。我同意。域\用户部分的一个答案是这个:***.com/a/185716/481656【参考方案5】:我也认为不是,因为前几天我问过自己同样的问题:D
你可以试试:
public static string GetDomain(string s)
int stop = s.IndexOf("\\");
return (stop > -1) ? s.Substring(0, stop + 1) : null;
public static string GetLogin(string s)
int stop = s.IndexOf("\\");
return (stop > -1) ? s.Substring(stop + 1, s.Length - stop - 1) : null;
【讨论】:
【参考方案6】:我不这么认为,因为 System.Security.Principal.WindowsIdentity 不包含此类成员。
【讨论】:
【参考方案7】:虽然不是 .NET 内置的,但始终可以 P/Invoke 到 CredUIParseUserName。 Here 是如何在 .NET 中使用它的示例。
PS:它似乎没有处理“.\username”中的“点”。
【讨论】:
【参考方案8】:似乎是用正则表达式解决的问题:
public static class UserExtensions
public static string GetDomain(this IIdentity identity)
Regex.Match(identity.Name, ".*\\\\").ToString()
public static string GetLogin(this IIdentity identity)
return Regex.Replace(identity.Name, ".*\\\\", "");
【讨论】:
当可以使用简单的字符串操作代替时,在这里使用正则表达式不是矫枉过正吗? 听起来像:我有问题。让我们使用正则表达式。现在我有两个问题:) 一个正则表达式用一个简单的行解决了这个问题。它们不是适合每项工作的工具,但我认为在这种情况下,正则表达式解决方案更优雅。以上是关于内置帮助器将 User.Identity.Name 解析为 Domain\Username的主要内容,如果未能解决你的问题,请参考以下文章
HttpContext.Current.User.Identity.Name为Empty
HttpContext.Current.User.Identity.Name 为空
User.Identity.Name 返回的是 UserName 而不是 Name