内置帮助器将 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

HttpContext.Current.User.Identity.Name 为空

User.Identity.Name 有啥问题

User.Identity.Name Mock