2016-06-18 6 views
0

私はAsp.Net Core RC2アプリケーションを使用しており、Cookieの認証に問題があります。 startup.csでは、私は基本構成したファイル:メモリに保存されているCookieのキー、サーバを切り替えることができません

app.UseIdentity(); 
app.UseCookieAuthentication(); 

を私はアイデンティティのインタフェースIUserStoreとIRoleStoreを実施しているドキュメンタルデータベースを、使用しているので、私は、EntityFrameworkを使用していませんよ。

デバッグのためにlocalhostにログインすると、永続的なCookieを設定しても、アプリケーションをシャットダウンするまで有効です。私はそれを再起動すると、クッキーが期限切れになり、サーバーはログインページにリダイレクトされます。これは、クッキーのキーが記憶されていることを私に教えてくれます。なぜ、dbのユーザーのプロファイルレコードにキーを保持しないのですか?クッキーは、アプリケーションが有効になるまで動作します。

これは、運用サーバーにアプリケーションを展開する際に発生する問題です。私は、プロダクション/ステージングソリューションを使用しています。ステージングにアプリケーションをデプロイし、サーバーを切り替えると、ログインしているすべてのユーザーのセッションが失効することに注意しました。これは大きな問題です。 2台のサーバーが異なるため、https://docs.asp.net/en/latest/security/data-protection/compatibility/cookie-sharing.htmlで提案されているように、ローカルディレクトリにCookieキーを共有することもできません。どうすれば解決できますか?

+0

新しいマシンに移行すると人々はログオフするだろうと心配ですか?どうして? –

+0

アジャイル開発で毎日のようにマシンを切り替えることができるので – tmm360

+1

私はredisのように**分散メモリキャッシュを使用できない理由は何ですか? Redisのサポートは、ASP.NET Coreでそのままの状態で提供され、Redisクラスタが必要なだけでアプリケーションにパッケージを追加し、承認ミドルウェアが登録される前のどこかにある 'AddRedisCache()'メソッドStartupクラスを呼び出します。これにより、デフォルトのInMemoryCacheではなく、Redisに値を格納するアプリケーションが作成されます – Tseng

答えて

1

私は問題がdocumentationは、デフォルトの設定が

だからソリューションは、の制御を取ることです単一のマシンのために良好であることを述べているのに対し、あなたは、複数のマシン間で同じデータ保護キーを使用する必要があるということだと思いますキーが格納されている場所でアプリと一緒に各サーバーにキーを展開することができます。私はまた、私のアプリでこれを行う必要があった。なぜなら私はデータ保護を使用してソーシャル認証の秘密など、dbの中のいくつかのものを暗号化していて、アプリが別のマシンに移行されればそれらを解読できる必要があるからです。

私は、起動中にこのような私のアプリでキーの場所を変更しました:

string pathToCryptoKeys = appBasePath + System.IO.Path.DirectorySeparatorChar + "dp_keys" + System.IO.Path.DirectorySeparatorChar; 
services.AddDataProtection() 
      .PersistKeysToFileSystem(new System.IO.DirectoryInfo(pathToCryptoKeys)); 

が、ので注意の偉大な取引がどこにについて考えて使用する必要があり、安全なこれらのキーを維持するために非常に非常に重要ですそれらを保存し、その場所へのアクセス権を持っている人は、私の例のようにその下に置くのがおそらく最高の解決策ではないでしょう。

関連する問題