_HttpContext.Current.User.Identity.Name
_を解析するための組み込みユーティリティまたはヘルパーはありますか? _domain\user
_が存在する場合、ドメイン名とユーザーを別々に取得するには?
または、そうするための他のクラスはありますか?
String.Split("\")
を呼び出すのは非常に簡単ですが、ただ興味深いことを理解しています
これは優れています(使いやすく、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は必要ありません。
System.Environment.UserDomainName
はドメイン名のみを提供します
同様に、System.Environment.UserName
はユーザー名のみを提供します
var components = User.Identity.Name.Split('\\');
var userName = components.Last()
var domainName = components.Reverse().Skip(1).FirstOrDefault()
また、「[email protected]」や「user @ domain」などの文字列入力の解析を検討することもできます。
これは私が現在やっていることです:
文字列に「\」が含まれている場合は、「\」で文字列を分割し、ユーザー名とドメインを抽出します
Else文字列に「@」が含まれている場合、「@」で文字列を分割し、ユーザー名とドメインを抽出します
それ以外の場合は、文字列をドメインなしのユーザー名として扱います
入力文字列が簡単に予測できる形式、つまり「domain\user @ domain」ではない場合、私はまだより良い解決策を探しています。私は正規表現を考えています...
更新:修正済みです。私の答えはちょっとしたコンテキストです。ユーザーログイン/ログオンプロンプトのように、ユーザー入力からユーザー名とドメインを解析する一般的なケースを指します。それがまだ誰かを助けることを願っています。
私も先日同じ質問を自問したからだ。
あなたが試すことができます:
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;
}
System.Security.Principal.WindowsIdentityにはそのようなメンバーが含まれていないため、そうは思いません。
.NETビルトインではありませんが、常にP/Invokeで CredUIParseUserName にできます。 ここ は.NETでの使用方法の例です。
PS:「。\ username」のように、「ドット」を処理していないようです。
正規表現によって解決される問題のようです:
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, ".*\\\\", "");
}
}