私たちのサイトは現在、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 に付与する必要がある追加のアクセス許可を特定できることを、誰かが教えてくれることを願っています。