7

Application_AuthenticateRequestWindows 認証済みユーザーを、プログラムで呼び出して取得する別のユーザーに置き換えるためにオーバーライドしていますLogonUser結果の WindowsPrinciple を Context.Userに割り当てると、次の例外が発生します。私の開発マシンではこの例外は発生せず (すべてが完全に機能します)、QA マシンでのみ発生します。どちらのマシンも Windows Server 2008 R2 です。QA マシンで何かが違うのですが、それが何かはわかりません。

これが私が達成しようとしていることの完全な説明です。

    [UnauthorizedAccessException: Attempted to perform an unauthorized operation.]
   System.Security.Principal.WindowsIdentity.get_AuthenticationType() +317
   System.Web.Hosting.IIS7WorkerRequest.SetPrincipal(IPrincipal user, IntPtr pManagedPrincipal) +106
   System.Web.HttpContext.SetPrincipalNoDemand(IPrincipal principal, Boolean needToSetNativePrincipal) +9022044
   System.Web.HttpContext.SetPrincipalNoDemand(IPrincipal principal) +6
   System.Web.HttpContext.set_User(IPrincipal value) +36
   MyProj.MvcApplication.OverrideLoginUser() in C:\Data\Project\MyProj\Global.asax.cs:317
   MyProj.MvcApplication.Application_AuthenticateRequest(Object sender, EventArgs e) in C:\Data\Project\MyProj\Global.asax.cs:305
   System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +148
   System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously) +75

アップデート

アプリケーション プールの ID を "ApplicationPoolIdentity" から "LocalSystem" に変更することで、QA マシンのエラーを解決しました。私の開発ボックスでは、設定は ApplicationPoolIdentity ですが、なぜ権限が異なるのですか? 失敗した機能にはどのようなアクセス許可が必要ですか?

更新 2

私はすべての選択肢を使い果たしました。ローカルの Administrators グループのユーザー アカウントを使用しても役に立ちません。機能する唯一のことは、アプリケーション プールを LocalSystem として実行することです。他の何人かの人々もこの問題を抱えていました(ここに文書化されています)どんなアイデアでも大歓迎です。ありがとう。

4

1 に答える 1

3

Ok。5時間しかかかりませんでしたが、解決策を見つけました。Identity.AuthenticationTypeにプリンシパル オブジェクトを割り当てる前に、新しく作成された ID のプロパティを呼び出すことで、呼び出す問題を絞り込みましたContext.User。今回もDevボックスで不正なエラーが発生しました。これは、何らかの理由で、Context.User割り当て中にプロパティが開発ボックスで実行されていなかったが、QA ボックスで実行されていたことを意味すると思います。とにかく、少しグーグルで調べた後、WindowsIdentity の構築中に AuthenticationType を指定する方法を示すこのドキュメントを見つけました。私がそれをした後、私の問題は解決しました!コードは次のとおりです。

// Construct a WindowsIdentity object using the input account token 
// and the specified authentication type.
var foo = new WindowsIdentity(logonToken, "WindowsAuthentication");

それでおしまい!両方のサーバーで認証エラーが発生しなくなりました!

于 2012-07-21T01:19:08.667 に答える