問題: IdentityServer3 Controllers で ASP.NET セッションを使用しようとしていますが、うまく動作しません。
OWIN ミドルウェアでセッションを有効にする方法を説明する同様の質問を見つけましたが、完全に機能しました。IdentityServer の外部 (つまり、"/core" にマップされたパイプラインの外部) にいくつかのコントローラーを作成しましたが、完全に機能しました。また、コントローラーに Autofac を追加して、Autofac (IdentityServer で広く使用されている) が問題ではなく、正常に動作することを確認しました。
これは作業コードです - Startup.cs:
// register middleware that enables session using SetSessionStateBehavior(SessionStateBehavior.Required)
app.RequireAspNetSession();
var config = new HttpConfiguration();
WebApiConfig.Register(config);
app.UseWebApi(config);
var builder = new ContainerBuilder();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
builder.RegisterType<DummyClassCreatedByAutofac>();;
var container = builder.Build();
config.DependencyResolver = new AutofacWebApiDependencyResolver(container);
//app.UseIdentityServer(); // if I add IdentityServer, context.Session is always null
これはうまくいきます。ミドルウェア (SetSessionStateBehavior) は要求ごとに実行され、セッションはコンストラクターで使用できます。ただし、app.UseIdentityServer()
Startup.cs に追加するとすぐに、IdentityServer が完全に機能し始めます (そして、すべての要求がセッション ミドルウェアを通過します) が、現在、Session はすべてのコントローラーに対して null です - IdentityServer コントローラーだけでなく、他のコントローラー (これらはIdentityServer パイプラインの外) - それらは動作を停止します。
すべてのコードを完全に削除して、通常の IdentityServer パイプラインに固執すると、パイプラインに RequireAspNetSession() を追加する正しい場所が見つかりません。いろいろなところに追加しようとしましたが、うまくいきませんでした。
試行錯誤の結果RequireAspNetSession()
、次の 2 つの呼び出しによってセッション ミドルウェアが破損していることに気付きました:app.UseEmbeddedFileServer()
と app.ConfigureCookieAuthentication
. 両方の呼び出しが削除されると、Session は IdentityServer コントローラーで使用できるようになりました (また、他のコントローラーでも使用できるようになりました)。おそらく問題は、これらの OWIN ミドルウェアの一部が特定の段階で実行されるため( を使用UseStageMarker
して定義するためPipelineStage
)、おそらくミドルウェアの優先順位を破っているからです。たとえば、UseEmbeddedFileServer はステージ上PipelineStage.MapHandler
で実行されるほか、RequireAspNetSession も実行されます。
app.RequireAspNetSession()
それらのミドルウェアの前後に追加してみましたが、どちらもうまくいきませんでした。実際、app.RequireAspNetSession()
これらのミドルウェアが構成されている Map() メソッド内で使用された場合は機能しません (内UseIdentityServer()
):
app.Map("/core", coreApp =>
{
// this DOESN'T work, even if I remove
// UseEmbeddedFileServer() or ConfigureCookieAuthentication()
coreApp.RequireAspNetSession();
//...
coreApp.UseIdentityServer(idsrvOptions);
}
_
// this WORKS as long as inside the Map() I don't call
// UseEmbeddedFileServer() or ConfigureCookieAuthentication()
app.RequireAspNetSession();
app.Map("/core", coreApp =>
{
//...
coreApp.UseIdentityServer(idsrvOptions);
}
最後に、Map メソッドを使用しない場合 (および IdentityServer API をルート フォルダーに直接セットアップする場合) は正常に動作します (UseEmbeddedFileServer() および ConfigureCookieAuthentication() ミドルウェアを保持している場合でも、すべてのコントローラーでセッションを利用できます)。しかし、マップされたフォルダーで API を実行する必要があるため、受け入れられません。
要約すると、Map() 内で RequireAspNetSession() を使用すると、機能しません (セッションは常に null です)。Map() の外側で RequireAspNetSession() を使用し、Map() の内側で UseEmbeddedFileServer() または ConfigureCookieAuthentication() を保持している場合、それも機能しません。
RequireAspNetSession() を IdentityServer3 パイプラインで機能させる方法は?
また、Map("/core") は、そのパイプラインの外部でホストされている DefaultController のパイプラインにどのように影響する (そして破損する) のでしょうか?