Owin Cookie認証の使用に奇妙な問題があります。
IISサーバーの認証を開始すると、IE / FirefoxおよびChromeで完全に正常に機能します。
認証を使用していくつかのテストを開始し、さまざまなプラットフォームでログインしましたが、奇妙なエラーが発生しました。散発的に、Owinフレームワーク/ IISはブラウザにCookieを送信しません。ユーザー名とパスワードを入力しますが、コードは正しく実行されますが、Cookieがブラウザーにまったく配信されません。サーバーを再起動した場合、サーバーが機能し始めます。ある時点でログインを試行すると、Cookieの配信が停止します。コードをステップオーバーしても何もせず、エラーもスローしません。
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
AuthenticationType = "ABC",
LoginPath = new PathString("/Account/Login"),
CookiePath = "/",
CookieName = "ABC",
Provider = new CookieAuthenticationProvider
{
OnApplyRedirect = ctx =>
{
if (!IsAjaxRequest(ctx.Request))
{
ctx.Response.Redirect(ctx.RedirectUri);
}
}
}
});
そして、私のログイン手順の中に次のコードがあります:
IAuthenticationManager authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
var authentication = HttpContext.Current.GetOwinContext().Authentication;
var identity = new ClaimsIdentity("ABC");
identity.AddClaim(new Claim(ClaimTypes.Name, user.Username));
identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, user.User_ID.ToString()));
identity.AddClaim(new Claim(ClaimTypes.Role, role.myRole.ToString()));
authentication.AuthenticationResponseGrant =
new AuthenticationResponseGrant(identity, new AuthenticationProperties()
{
IsPersistent = isPersistent
});
authenticationManager.SignIn(new AuthenticationProperties() {IsPersistent = isPersistent}, identity);
更新1:問題の原因の1つとして、セッションにアイテムを追加すると問題が発生するようです。のような単純なSession.Content["ABC"]= 123
ものを追加すると、問題が発生するようです。
私が知ることができるのは次のとおりです:1)(Chrome)ログインすると、ASP.NET_SessionId +認証Cookieを取得します。2)session.contentsを設定するページに移動します... 3)新しいブラウザー(Firefox)を開いてログインを試みますが、ASP.NET_SessionIdを受信せず、認証Cookieも取得しません4)最初のブラウザーではASP.NET_SessionIdがあり、引き続き機能します。このCookieを削除すると、IPアドレス(10.xxx)とlocalhostで作業している他のすべてのブラウザーと同じ問題が発生します。
更新2:ASPNET_SessionId
OWINで認証する前に、login_loadページで最初に強制的に作成します。
1)OWINで認証する前にSession.Content
、ログインページでランダムな値を作成してASP.NET_SessionIdを開始します2)次に認証を行い、さらにセッションを行います3)他のブラウザーが動作するようです
これは奇妙です。これは、ASPとOWINが異なるドメインにあると思っているか、そういうものと関係があると結論づけることができます。
更新3-2つの間の奇妙な動作。
その他の奇妙な動作が確認されました-OwinとASPセッションのタイムアウトが異なります。私が目にしているのは、何らかのメカニズムにより、私のOwinセッションがASPセッションよりも長く存続しているということです。したがって、ログインするとき:1.)Cookieベースの認証セッションがあります2.)いくつかのセッション変数を設定します
セッション変数(2)は、owin cookieセッション変数の前に「死ぬ」ため、再ログインが強制され、アプリケーション全体で予期しない動作が発生します。(個人はログインしていますが、実際にはログインしていません)
3Bを更新
少し掘り下げた後、「フォーム」認証タイムアウトとセッションタイムアウトを一致させる必要があることを示すコメントがページに表示されました。通常、2つは同期していると思いますが、何らかの理由で2つが同期していません。
回避策の概要
1)認証の前に、常に最初にセッションを作成します。基本的に、アプリケーションの起動時にセッションを作成しますSession["Workaround"] = 0;
2)[実験的] Cookieを保持する場合は、OWINタイムアウト/長さがweb.configのsessionTimeoutよりも長いことを確認してください(テスト中)