web-dev-qa-db-ja.com

User.Identity.NameをDomain \ Usernameに解析する組み込みヘルパー

_HttpContext.Current.User.Identity.Name_を解析するための組み込みユーティリティまたはヘルパーはありますか? _domain\user_が存在する場合、ドメイン名とユーザーを別々に取得するには?

または、そうするための他のクラスはありますか?

String.Split("\")を呼び出すのは非常に簡単ですが、ただ興味深いことを理解しています

46
abatishchev

これは優れています(使いやすく、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は必要ありません。

69
Aen Sidhe

System.Environment.UserDomainNameはドメイン名のみを提供します

同様に、System.Environment.UserNameはユーザー名のみを提供します

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

var userName = components.Last() 

var domainName = components.Reverse().Skip(1).FirstOrDefault()
7
Gruff Bunny

また、「[email protected]」や「user @ domain」などの文字列入力の解析を検討することもできます。

これは私が現在やっていることです:
文字列に「\」が含まれている場合は、「\」で文字列を分割し、ユーザー名とドメインを抽出します
Else文字列に「@」が含まれている場合、「@」で文字列を分割し、ユーザー名とドメインを抽出します
それ以外の場合は、文字列をドメインなしのユーザー名として扱います

入力文字列が簡単に予測できる形式、つまり「domain\user @ domain」ではない場合、私はまだより良い解決策を探しています。私は正規表現を考えています...

更新:修正済みです。私の答えはちょっとしたコンテキストです。ユーザーログイン/ログオンプロンプトのように、ユーザー入力からユーザー名とドメインを解析する一般的なケースを指します。それがまだ誰かを助けることを願っています。

4
Omar

私も先日同じ質問を自問したからだ。

あなたが試すことができます:

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;
}
4
inspite

System.Security.Principal.WindowsIdentityにはそのようなメンバーが含まれていないため、そうは思いません。

1
Aen Sidhe

.NETビルトインではありませんが、常にP/Invokeで CredUIParseUserName にできます。 ここ は.NETでの使用方法の例です。

PS:「。\ username」のように、「ドット」を処理していないようです。

1
Mihai

正規表現によって解決される問題のようです:

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