25

ドメインのメソッドを使用UserPrincipal.Current.ToString()して、有効なドメインを持つ現在ログインしているドメインユーザーを取得しています。しかし、文字列で表示している場合、IISサーバーでホストされているとエラーが発生します。

Unable to cast object of type 'System.DirectoryServices.AccountManagement.GroupPrincipal'
           to type 'System.DirectoryServices.AccountManagement.UserPrincipal'.
4

3 に答える 3

37

私も同じ問題を抱えていました。ローカルマシンでは完全に機能しましたが、サーバー上のIISに展開すると失敗しました。結局、私はそれを機能させるために2つのことを変更しなければなりませんでした:

  1. 認証を「Windows認証」に変更する(ハウツー

  2. currentを使用する代わりに、2つのステップで実行します:( source

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

UserPrincipal user = UserPrincipal.FindByIdentity(ctx, User.Identity.Name);

そして、最終的に名前(またはその他の情報)を取得するために、を使用しuser.DisplayNameました。

于 2015-08-04T21:46:37.827 に答える
7

Windows7のIIS7で実行しているときに、この例外が発生しました。

System.Security.Principal.WindowsIdentity.GetCurrent()。Nameは、「IIS APPPOOL\ASP.NETv4.0」を返します。

これは実際のユーザーアカウントではありません。これは、何が起こっているかを部分的に説明していますが、IMHOUserPrincipal.Currentはこの状況をより適切に処理する必要があります。

これはバグであり、Connectでバグが発生したと思います。

http://connect.microsoft.com/VisualStudio/feedback/details/748790/userprincipal-current-throws-invalidcastexception

回避策として、を使用System.Security.Principal.WindowsIdentity.GetCurrent()してIISAppPoolのIDを取得します。

于 2012-06-13T12:28:28.177 に答える
3

ここでの問題は、UserPrincipal.Currentプロパティが現在のスレッドのコンテキストにアクセスしようとすることです。ただし、ASP.NETの偽装がない場合は、IDがアプリケーションプールの構成済みIDになります。ASP.NETの偽装を使用している場合でも、何らかの方法でActive Directoryにアクセスする必要があるため、ドメインコントローラーに対して認証する必要があります。IISで選択した認証方法でそれができない場合は、同様のエラーが発生する可能性があります。

私の経験では、「BASIC」認証と100%正しく実装されたバージョンの「KERBEROS」のみが機能します。Kerberosは、アプリケーションプールおよびSPNの処理方法と実際には互換性がなく、失敗する可能性があることに注意してください。サーバーにパスワードがないため、NTLM(IISでのWindows認証のフォールバック)は機能しません。

HTTP /Kerberosの問題に関する良い読み物は次のとおりです。http://blogs.msdn.com/b/friis/archive/2009/12/31/things-to-check-when-kerberos-authentication-fails-using-iis -ie.aspx

于 2013-02-18T16:13:01.867 に答える