2012-06-13 22 views
12

有効なドメインを持つドメインユーザーに現在ログインしているドメインでメソッドUserPrincipal.Current.ToString()を使用しています。しかし、IISサーバーでホストされているとき、私は、文字列にその与えるエラーを表示していたとき:System.DirectoryServices.AccountManagement.GroupPrincipalで型のオブジェクトをキャストできません

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

これは役に立ちますか? http://stackoverflow.com/a/10848934/43846 – stuartd

答えて

14

私は同じ問題を抱えていました。私のローカルマシンでは完全に機能しましたが、サーバー上のIISに展開すると失敗しました。 (source:二つのステップでそれをやって、

  1. 変更する代わりに電流を使用しての認証に「Windows認証」(how-to

  2. :最後に、私はそれを動作させるために二つのことを変更しなければなりませんでした)

PrincipalContext ctx = new PrincipalContext(ContextType.Domain);

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

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

+3

これは私のためにエラーをスローする (&(objectCategory = user)(objectClass = user)(|(userName))(distinguishedName =)))searchフィルタが無効です。 説明:現在のWeb要求の実行中に、未処理の例外が発生しました。エラーの詳細とコード内のどこで発生したのかについては、スタックトレースを参照してください。 例外の詳細:System.ArgumentException:(&(objectCategory = user)(objectClass = user)(|(userPrincipalName =)(distinguishedName =)(name =)))検索フィルターが無効です – Kurkula

5

System.Security.Principal

7、Windows上でIIS 7の下で実行している場合、私はこの例外を見てきました.WindowsIdentity.GetCurrent()。Nameは "IIS APPPOOL \ ASP.NET v4.0"を返します。

これは私見UserPrincipal.Currentは、より優雅に、このような状況に対処すべきであるものの、部分的に、何が起こっているかを説明しnot a real user account、です。

私はそれはバグだと思うし、Connectのバグ作成しました:回避策として

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

を、IISアプリケーションプールのIDを取得するためにSystem.Security.Principal.WindowsIdentity.GetCurrent()を使用しています。

2

ここでの問題は、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