6

(この質問は、.NET Web アプリケーションでログインしているユーザーの UPN または電子メールを取得するに似ていますが、完全ではありません。)

Windows 認証を使用する .NET (C#) Web アプリケーションで、サインインしているユーザーの UPN を見つけたいと考えています。

Active Directory にクエリを実行することでこれを行う方法を知っていますHttpContext.Current.User.Identity as WindowsIdentity。の下にある DOMAINNAMEldap://RootDSEを調べて、そのdnsRoot;を見つけます。(&(objectCategory=person)(objectClass=user)(sAMAccountName=...userName...))下のクエリldap://...dnsRoot...。このエントリのuserPrincipalNameプロパティを取得します。(詳細はhttps://stackoverflow.com/a/513668/223837の回答にあります)。

私の質問: Active Directory を呼び出さに UPN を見つけることはできますか? どこでも UPN を使用することに Microsoft が重点を置いていることを考えると、UPN は、ユーザーが Web サーバーに対して認証するときに作成されるトークンのどこかに既に格納されているのではないでしょうか?

(補足観察: whoami /upnWindows 7 で実行した場合、Wireshark は Active Directory 接続を表示しません。)

(違いがある場合: Web アプリケーションは偽装を使用していないことに注意してください。つまり、Web アプリケーションはユーザー ID で実行されません。)

4

2 に答える 2

5

System.DirectoryServices.AccountManagement.UserPrincipal.Currentプロパティを持つ を試してくださいUserPrincipalName。もちろん、そのためには、アプリケーションが Windows 認証で実行されている必要があります。

編集Meh、この API はまだディレクトリ ルックアップを実行しているようです。

于 2012-06-08T09:33:17.320 に答える
4

を使用しているときに Active Directory クエリに問題があったため、この形式System.DirectoryServices.AccountManagement.UserPrincipal.Currentを使用GetUserNameExすることにしました。NameUserPrincipal

この関数は現在のユーザーに関する情報を取得するため、まだ偽装していない場合は偽装する必要があります。C# では、関数をインポートすることで実行できます。

public enum EXTENDED_NAME_FORMAT
{
    NameUnknown = 0,
    NameFullyQualifiedDN = 1,
    NameSamCompatible = 2,
    NameDisplay = 3,
    NameUniqueId = 6,
    NameCanonical = 7,
    NameUserPrincipal = 8,
    NameCanonicalEx = 9,
    NameServicePrincipal = 10,
    NameDnsDomain = 12
}

[DllImport("secur32.dll", CharSet = CharSet.Auto)]
public static extern int GetUserNameEx(int nameFormat, StringBuilder userName, ref int userNameSize);

次に、次のように呼び出します。

string upn = null;
StringBuilder userName = new StringBuilder(1024);
int userNameSize = userName.Capacity;
if (GetUserNameEx((int)EXTENDED_NAME_FORMAT.NameUserPrincipal, userName, ref userNameSize) != 0)
{
    upn = userName.ToString();
}
于 2016-03-03T18:47:55.480 に答える