web-dev-qa-db-ja.com

AspNet Coreは、IIS

AspNet Mvc Core RC1 Webサイトで運用サーバー(Windows Server 2012)を実行しています。

ログに以下が表示されます。

Neither user profile nor HKLM registry available. Using an ephemeral key repository. Protected data will be unavailable when application exits.

DataProtection のソースコードを検査した後、次のメソッド呼び出しの問題を追跡しました。

Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData)

これはおそらく何らかの理由でサーバー上でnullを返しています。特別なカスタム構成を用意しておらず、 docs を読んだので、デフォルトで機能すると思いました。

問題はIIS Webサイトが特定のユーザーのコンテキストで実行されていないことですが、これを確認または修正する方法がわかりません。私のWebサイトは独自のプールで構成されています。

余談ですが、キーを格納するためにメモリ内リポジトリを実行した結果、アプリケーションが終了するたびにキーがリサイクルされ、非常に煩わしく、意図もされていません本番環境で使用します。

35
mrahhal

ユーザープロファイルはIIS構成でロードする必要があります。

IISを開き、[アプリケーションプール]を右クリックして、[詳細設定]をクリックします。 「ユーザープロファイルの読み込み」をtrueに設定します。アプリを再起動すると、完全に機能するはずです。

31
mrahhal

ASP.NETアプリケーションで使用されるデータ保護キーは、アプリケーションの外部のレジストリハイブに格納されます。アプリケーションをAppPool Identityとして実行する場合、ASP.NET Coreアプリケーションで使用されるevery AppPoolのレジストリハイブを作成する必要があります。

スタンドアロンIISインストールの場合、 データ保護PowerShellスクリプト各アプリケーションプール用をASP.NET Coreアプリケーションで使用できます。キーはレジストリに保持されます。

ログに明確に記載されているように、Data Protectionが検索するレジストリハイブが存在しないため、キーはディスクに保持されません。代わりに、それらは一時的で、メモリ内にのみ存在します。

Webファームのシナリオでは、UNCパスを使用してデータ保護キーリングを格納するようにアプリケーションを構成できます。デフォルトでは、データ保護キーは暗号化されていません。各マシンにx509証明書をデプロイして、鍵リングを暗号化できます。

詳細については、 公式ASP.NET Coreドキュメント を参照してください

11

アクセス権が非常に制限されているホスト環境にいるユーザーは、代わりに PersistKeysToFileSystem を使用できます。次のリストをStartup.csに追加すると、問題が解決します。

public void ConfigureServices(IServiceCollection services)
{
    services.AddDataProtection()
    .PersistKeysToFileSystem(new DirectoryInfo(@"\\server\share\directory\"));
}

必要に応じてパス文字列を変更できます。 ProtectKeysWith *構成APIのいずれかを呼び出して、保存されているキーを保護するようにシステムを構成する場合は、 ProtectKeysWith も確認してください。

1
vahid

DataProtection Gitリポジトリから thisを見てください

要するに、IISにはバグがあり、DataProtectionキーの正しいレジストリセットアップを妨げるように修正されない可能性があります。 Powershellスクリプト AspNet Coreで動作するようにレジストリを手動で正しく設定します。AspNetCoreアプリケーションで使用する各アプリケーションプールのスクリプトを実行すると、それらのアプリケーションは意図したとおりに動作します。

0
Yepeekai