0

私たちのサイトは現在、Windows 認証を使用するようにセットアップされています。ユーザー セキュリティ プリンシパルは、要求がコードに到達すると自動的に設定され、特定のファイルへの承認は web.config の承認要素で制御されます。

認証を処理するために、サーバーに siteminder をインストールすることが義務付けられました。このため、ユーザー セキュリティ プリンシパルは自動的に設定されず、変更を加えていないコードでは、承認を決定するユーザーが誰であるかがわかりません。

その問題を解決するために、次のコードを開発しました。siteminder が要求に挿入するヘッダーからユーザー名を取得し、ユーザー セキュリティ プリンシパルを作成します。

protected void Application_AuthenticateRequest(object sender, EventArgs e)

        protected void Application_AuthenticateRequest(object sender, EventArgs e)
        {
            string userSSO = null;

            //Siteminder gives us user like in this format domain\user
            userSSO = HttpContext.Current.Request.Headers["SMUser"];

            if (userSSO != null && userSSO != "")
            {
                //we have to take the id in the format siteminder gives us and switch it over to upn format like this user@domain
                string [] delimiters = {"\\"};
                string [] aryUserSSO = userSSO.Split(delimiters, StringSplitOptions.RemoveEmptyEntries);
                string UPN = aryUserSSO[1] + "@" + aryUserSSO[0] + "domain.com";


                //now we create identity and princal objects using the UPN
                WindowsIdentity identity = new WindowsIdentity(UPN, "WindowsAuthentication");

                WindowsPrincipal principal = new WindowsPrincipal(identity);

                HttpContext.Current.User = principal;
            }
        }

このコードは、IIS 上の AppPool の ID が LocalSystem として実行されるように設定されている限り、正常に機能します。ただし、AppPool の ID を NetworkService や ApplicationPoolIdentity などのアクセス許可の少ないものに設定すると、次のエラー メッセージが表示されます。

'/Form1' アプリケーションでサーバー エラーが発生しました。

不正な操作を実行しようとしました。説明: 現在の Web 要求の実行中に未処理の例外が発生しました。エラーの詳細とコード内のどこでエラーが発生したかについては、スタック トレースを確認してください。

例外の詳細: System.UnauthorizedAccessException: 許可されていない操作を実行しようとしました。

ASP.NET は、要求されたリソースへのアクセスを許可されていません。リソースへのアクセス権を ASP.NET 要求 ID に付与することを検討してください。ASP.NET には、アプリケーションが偽装されていない場合に使用されるベース プロセス ID (通常、IIS 5 または IIS 6 および IIS 7 のネットワーク サービスの {MACHINE}\ASPNET、および IIS 7.5 の構成済みアプリケーション プール ID) があります。アプリケーションが を介して偽装している場合、ID は匿名ユーザー (通常は IUSR_MACHINENAME) または認証された要求ユーザーになります。

ファイルへの ASP.NET アクセスを許可するには、エクスプローラーでファイルを右クリックし、[プロパティ] を選択して、[セキュリティ] タブを選択します。[追加] をクリックして、適切なユーザーまたはグループを追加します。ASP.NET アカウントを強調表示し、必要なアクセスのボックスをオンにします。

ソース エラー:

現在の Web 要求の実行中に未処理の例外が生成されました。例外の発生元と場所に関する情報は、以下の例外スタック トレースを使用して特定できます。

スタックトレース:

[UnauthorizedAccessException: 不正な操作を実行しようとしました。]
System.Security.Principal.WindowsIdentity.get_AuthenticationType() +300 System.Web.Hosting.IIS7WorkerRequest.SetPrincipal(IPrincipal ユーザー、IntPtr pManagedPrincipal) +181
System.Web.HttpContext.SetPrincipalNoDemand( IPrincipal プリンシパル、ブール値 needToSetNativePrincipal) +701
System.Web.HttpContext.set_User(IPrincipal 値) +49
System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute() +182 System.Web.HttpApplication.ExecuteStep(IExecutionStep ステップ, Boolean& completedSynchronously) +266

-------------------------------------------------- ------------------------------ バージョン情報: Microsoft .NET Framework バージョン:4.0.30319; ASP.NET バージョン:4.0.30319.1022

また、サーバーのイベント ビューアにもこれが表示されます。

次の例外は、アプリケーション '/Form1' の Web イベント プロバイダー 'EventLogProvider' によってスローされました (アプリケーションの有効期間内に、プロバイダー インスタンスごとに最大 1 つの例外がログに記録されます):

System.UnauthorizedAccessException: 許可されていない操作を実行しようとしました。System.Security.Principal.WindowsIdentity.get_AuthenticationType()
で System.Web.Management.EventLogWebEventProvider.AddWebRequestInformationDataFields (ArrayList dataFields、WebRequestInformation reqInfo) で System.Web.Management.EventLogWebEventProvider.ProcessEvent (WebBaseEvent eventRaised) で System.Web.Management. WebBaseEvent.RaiseInternal(WebBaseEvent eventRaised, ArrayList fireRuleInfos, Int32 index0, Int32 index1)

この記事 ( The following exception was throw by the web event provider 'EventLogProvider' ) によると、問題はコードが EventLog に書き込もうとしているが、アクセス許可がなかったことだと思いました。ただし、記事 ( http://support.thycotic.com/KB/a220/giving-application-pool-access-to-event-log.aspx )で説明されている手順を実行しても、まだ機能しません。

私のコードがサーバー上で何をしようとしているのか、ApplicationPoolIdentity がアクセスできないこと、および ApplicationPoolIdentity に付与する必要がある追加のアクセス許可を特定できることを、誰かが教えてくれることを願っています。

4

1 に答える 1