2008-12-08 97 views
46

是否有任何內置實用程序或幫助程序來解析HttpContext.Current.User.Identity.Name,例如, domain\user獲得單獨的域名,如果存在和用戶?內置幫助程序將User.Identity.Name解析爲Domain Username

或者還有其他的課程嗎?

據我所知,這是很容易調用String.Split("\")但只是有趣

+1

這是我們經常忘記問自己的簡單問題。期待這個問題的任何有用的答案。 – 2008-12-08 13:25:50

回答

68

這是更好的(更容易使用,沒有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。

+7

您在`GetLogin`中的return語句可以簡化爲`return s.Substring(stop + 1);` – 2013-08-01 12:31:47

+0

如果用戶名有多個反斜槓怎麼辦?如果用戶想要使用[email protected]的UPN格式呢?我結束了使用Win32函數CredUIParseUserName。請參閱http://www.pinvoke.net/default.aspx/credui.creduiparseusername – 2017-10-04 15:57:42

1

我不這麼認爲,因爲System.Security.Principal.WindowsIdentity不包含這樣的成員。

4

我覺得沒有太多,因爲我問自己同樣的問題前些天: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; 
} 
3

你們也可能會考慮解析字符串輸入,如「[email protected]」或「user @ domain」。

這是目前我在做什麼:
如果字符串包含「\」在隨後分割字符串「\」及摘錄用戶名和域名
否則如果字符串包含「@」在再拆串「@」和提取用戶名和域名
否則將字符串視爲沒有域名的用戶名

在輸入字符串不是易於預測的格式的情況下,我仍然在尋找更好的解決方案,即「domain \ user @ domain 」。我正在想RegEx ...

更新:我站在更正。我的答案有點不同,它指的是解析用戶輸入的用戶名和域的一般情況,就像用戶登錄/登錄提示符一樣。希望它仍然有助於某人。

+0

需要一個優雅的解決方案。我同意。對域\用戶部分的一個答案是這樣的:http://stackoverflow.com/a/185716/481656 – DoomerDGR8 2012-06-06 08:51:41

13

System.Environment.UserDomainName給您正在訪問的域名只有

同樣,System.Environment.UserName給你的用戶名只

+2

> System.Environment.UserDomainName`只給你域名 >>同樣,System.Environment.UserName `只給你用戶名這在ASP.NET – 2011-08-23 08:03:37

5
var components = User.Identity.Name.Split('\\'); 

var userName = components.Last() 

var domainName = components.Reverse().Skip(1).FirstOrDefault() 
0

好像做出正則表達式來解決的問題:

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, ".*\\\\", ""); 
    } 
} 
1

雖然不是.NET內置的,但可以始終P/Invoke爲CredUIParseUserNameHere是如何在.NET中使用它的一個例子。

PS:它似乎不處理「點」,如「。\ username」中。