ASP.NET_SessionId + OWIN Cookieがブラウザーに送信されない


145

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よりも長いことを確認してください(テスト中)


1
ActionResult LoginとActionResult ExternalLoginにセッションコールを追加すると、この問題が修正されたことを確認できます。必要なのは1つだけですが、両方が用意されています。
スコット

ありがとうございました... ExternalLoginにセッションを追加すると修正されました...これはブードゥー教の魔法です...この問題を
回避

回答:


159

同じ問題が発生し、原因をOWIN ASP.NETホスティング実装に追跡しました。バグだと思います。

いくつかの背景

私の調査結果はこれらのアセンブリバージョンに基づいています:

  • Microsoft.Owin、Version = 2.0.2.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35
  • Microsoft.Owin.Host.SystemWeb、Version = 2.0.2.0、Culture = neutral、PublicKeyToken = 31bf3856ad364e35
  • System.Web、Version = 4.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a

OWINは独自の抽象化を使用して、応答Cookie(Microsoft.Owin.ResponseCookieCollection)を処理します。この実装は、応答ヘッダーコレクションを直接ラップし、それに応じてSet-Cookieヘッダーを更新します。OWIN ASP.NETホスト(Microsoft.Owin.Host.SystemWeb)は、System.Web.HttpResponseとそのヘッダーコレクションをラップするだけです。したがって、新しいCookieがOWINを介して作成されると、応答のSet-Cookieヘッダーが直接変更されます。

ただし、ASP.NETも独自の抽象化を使用して、応答Cookieを処理します。これはSystem.Web.HttpResponse.Cookiesプロパティとして公開され、シールされたクラスSystem.Web.HttpCookieCollectionによって実装されます。この実装は応答Set-Cookieをラップしませんヘッダーを直接が、いくつかの最適化と少数の内部通知を使用して、状態の変化を応答オブジェクトに明示します。

次に、HttpCookieCollectionの変更された状態がテストされ(System.Web.HttpResponse.GenerateResponseHeadersForCookies())、CookieがSet-Cookieヘッダーにシリアル化される要求の有効期間の後半の時点があります。このコレクションが特定の状態にある場合、Set-Cookieヘッダー全体が最初にクリアされ、コレクションに格納されているCookieから再作成されます。

ASP.NETセッション実装は、System.Web.HttpResponse.Cookiesプロパティを使用して、ASP.NET_SessionId Cookieを格納します。また、ASP.NETセッション状態モジュール(System.Web.SessionState.SessionStateModule)には、s_sessionEverSetという名前の静的プロパティを介して実装されている基本的な最適化がいくつかあります。アプリケーションで何かをセッション状態に保存する場合、このモジュールは各リクエストに対してもう少し作業を行います。


ログイン問題に戻る

これらすべての要素を使用して、シナリオを説明できます。

ケース1-セッションが設定されなかった

System.Web.SessionState.SessionStateModule、s_sessionEverSetプロパティがfalseです。セッション状態モジュールによってセッションIDは生成されSystem.Web.HttpResponse.Cookiesコレクション状態は変更されたものとして検出されません。この場合、OWIN Cookieはブラウザに正しく送信され、ログインが機能します。

ケース2-セッションがアプリケーションのどこかで使用されたが、ユーザーが認証を試みる前ではなかった

System.Web.SessionState.SessionStateModule、s_sessionEverSetプロパティはtrueです。セッションIDはSessionStateModuleによって生成され、ASP.NET_SessionIdはSystem.Web.HttpResponse.Cookiesコレクションに追加されますが、ユーザーのセッションは実際には空であるため、リクエストの有効期間の後半で削除されます。この場合、System.Web.HttpResponse.Cookiesコレクションの状態が変更されたこと検出され、Cookieがヘッダー値にシリアル化される前に、Set-Cookieヘッダーが最初にクリアされます。

この場合、OWIN応答Cookieは「失われ」、ユーザーは認証されず、ログインページにリダイレクトされます。

ケース3-ユーザーが認証を試みる前にセッションが使用される

System.Web.SessionState.SessionStateModule、s_sessionEverSetプロパティはtrueです。セッションIDはSessionStateModuleによって生成され、ASP.NET_SessionIdがSystem.Web.HttpResponse.Cookiesに追加されます。System.Web.HttpCookieCollectionおよびSystem.Web.HttpResponse.GenerateResponseHeadersForCookies()の 内部最適化により、Set-Cookieヘッダーは最初はクリアされず、更新されるだけです。

この場合、OWIN認証CookieとASP.NET_SessionId Cookieの両方が応答として送信され、ログインが機能します。


Cookieに関するより一般的な問題

ご覧のとおり、問題はより一般的であり、ASP.NETセッションに限定されません。Microsoft.Owin.Host.SystemWebを介してOWINをホストしていて、あなた/何かがSystem.Web.HttpResponse.Cookiesコレクションを直接使用している場合、リスクがあります。

たとえば、これは機能し、両方のCookieがブラウザに正しく送信されます...

public ActionResult Index()
{
    HttpContext.GetOwinContext()
        .Response.Cookies.Append("OwinCookie", "SomeValue");
    HttpContext.Response.Cookies["ASPCookie"].Value = "SomeValue";

    return View();
}

しかし、これは行われず、OwinCookieは「失われます」...

public ActionResult Index()
{
    HttpContext.GetOwinContext()
        .Response.Cookies.Append("OwinCookie", "SomeValue");
    HttpContext.Response.Cookies["ASPCookie"].Value = "SomeValue";
    HttpContext.Response.Cookies.Remove("ASPCookie");

    return View();
}

どちらもVS2013、IISExpress、およびデフォルトのMVCプロジェクトテンプレートからテストされています。


7
テスト環境でこの問題をデバッグして解決するために数日を費やしました。私が見つけた唯一の回避策は、あなたが提案したものと同じです(ユーザーが認証する前にセッションを設定する)。この問題をkatanaproject ... katanaproject.codeplex.com/workitem/197に報告したので、誰かがそこでコメントするかもしれません。
Tomas Dolezal

11
特にvs2013のテンプレートをパッケージ化したので、これはかなり深刻な欠陥です。
Piotr Stulinski 2014年

2
これをさらに調査したい人のために、github.com
Neilski / IdentityBugDemo

1
Sessionをバッキングストアとして使用するController.TempDataを使用しているため、この問題が発生します。以前のリクエストでASP_NET.SessionId Cookieが存在しない場合、ログインできないことを簡単に再現できます。
kingdango 2014

2
最後に!これはなんと奇妙な問題でしょう。ありがとうございました。これは、この回答が書かれてから2年が経過してもまだ問題です。
Spivonious

43

@TomasDolezalによるすばらしい分析から始めて、OwinとSystem.Webソースの両方を調べました。

問題は、System.WebにCookie情報の独自のマスターソースがあり、それがSet-Cookieヘッダーではないことです。OwinはSet-Cookieヘッダーのみを認識します。回避策は、Owinによって設定されたCookieがHttpContext.Current.Response.Cookiesコレクションにも設定されていることを確認することです。

私は、まさにそれを行う小さなミドルウェア(sourcenuget)を作成しました。これは、cookieミドルウェア登録のすぐ上に配置することを目的としています。

app.UseKentorOwinCookieSaver();

app.UseCookieAuthentication(new CookieAuthenticationOptions());

1
これを試してみます。asp.net Identity 2.2.0-alpha1以降、ログイン時だけでなくユーザーのログアウト時にも問題が発生し始めました(ユーザーがWebサイトをしばらく開いたままにした場合、ユーザーは通常、ログアウトクリックでログアウトしません|ユーザーがログインする直前にセッションを設定した後、ログインの問題は解決しましたが、ログアウトの問題は解決しません。努力していただきありがとうございます。ちなみに、のインストール以外にすべきことはありますか?その包み?
ウーファー2014年

app.UseKentorCookieMiddlewareSaver();Startup.Auth.csで有効にする必要があります。ログアウトCookieのクリアも処理する必要があります。
Anders Abel

Anders Abelに感謝します。ログインとログアウトの両方が正常に機能します。しかし、上記のコメントのコードは変更する必要があります(私はそれをフォローしたので:)成功app.UseKentorOwinCookieSaver()しません):おそらく、パッケージのGitHubページのように元の回答に含まれています
ウーファー14

1
間違ったドキュメントにご注意いただきありがとうございます。実際にはすでにGitHubページで修正されていますが、ここでも私の回答で更新しました。
Anders Abel

@AndersAbel私はこのgithubプロジェクトのMeetupサインアップを追加しようとしています:github.com/owin-middleware/OwinOAuthProviders ''。先日、Asanaを追加しましたが問題はありませんでしたが、何らかの理由で、Meetupで、Account // ExternalLoginCallbackのawait AuthenticationManager.GetExternalLoginInfoAsync()メソッドがnullを返しています。残念ながら、NuGetパッケージは私の問題を解決しませんでした。問題をより適切にトラブルシューティングしてプロジェクトにプッシュできる可能性があるため、私と一緒に確認する時間があるかと思いました。
Anthony Ruffino、2015

42

つまり、.NET Cookie ManagerはOWIN Cookie Managerより優先され、OWINレイヤーに設定されたCookieを上書きします。修正は、ここでKatana Projectのソリューションとして提供されているSystemWebCookieManagerクラスを使用することです。このクラスまたはそれに類似したクラスを使用する必要があります。これにより、OWINは.NET Cookieマネージャーを使用するように強制されるため、矛盾が発生しません

public class SystemWebCookieManager : ICookieManager
{
    public string GetRequestCookie(IOwinContext context, string key)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
        var cookie = webContext.Request.Cookies[key];
        return cookie == null ? null : cookie.Value;
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);

        bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
        bool pathHasValue = !string.IsNullOrEmpty(options.Path);
        bool expiresHasValue = options.Expires.HasValue;

        var cookie = new HttpCookie(key, value);
        if (domainHasValue)
        {
            cookie.Domain = options.Domain;
        }
        if (pathHasValue)
        {
            cookie.Path = options.Path;
        }
        if (expiresHasValue)
        {
            cookie.Expires = options.Expires.Value;
        }
        if (options.Secure)
        {
            cookie.Secure = true;
        }
        if (options.HttpOnly)
        {
            cookie.HttpOnly = true;
        }

        webContext.Response.AppendCookie(cookie);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        AppendResponseCookie(
            context,
            key,
            string.Empty,
            new CookieOptions
            {
                Path = options.Path,
                Domain = options.Domain,
                Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
            });
    }
}

アプリケーションの起動時に、OWIN依存関係を作成するときに割り当てるだけです。

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    ...
    CookieManager = new SystemWebCookieManager()
    ...
});

同様の回答がここに提供されていますが、問題を解決するために必要なすべてのコードベースが含まれていないため、Katana Projectへの外部リンクがダウンし、これを完全に記録する必要があるため、ここに追加する必要があると思いますここでも解決策として。


おかげで、その仕事は私だけでなく、このControllerContext.HttpContext.Session.RemoveAll();を呼び出してすべてのセッションをクリアします。externallogincallback関数内
adnan

ASP.NET Webforms 4.6.1に適用されますか?私のwebAppが使用するASP.NET Webforms, OWIN, ADFS
Kiquenet

@Kiquenet WebアプリはOWINクッキーを使用していますか?その後はい。
Alexandru

コードStartup.ConfigureAuthにはapp.UseCookieAuthenticationapp.UseWsFederationAuthenticationそしてついに app.UseStageMarker
Kiquenet、2016年

@Alexandruあなたは編集を検討するかもしれませんが、私のチームはこのバグにぶつかりました、そしてそれはまれでランダムでした、それはDEVとUAT環境を通して私たちから隠されました。あなたの答えからのこの引用は私たちのために保持しませんでした:「.NET cookieマネージャーは常に勝つでしょう」OWINのCookieが常に上書きされた場合、それを見つけて修正するのは簡単です。OIDCミドルウェアが開発ワークステーションから削除されなかった場合は、しかし、そのランダム性により、バグが2日間本番環境に到達してから大規模に攻撃されました(内部での使用の半分はAAD経由でログインできませんでした)。回答から「常に」という言葉を削除してもよろしいですか?
yzorg 2017

17

カタナチームは、Tomas Dolezarが提起した問題に回答し、回避策に関するドキュメントを投稿しました。

回避策は2つのカテゴリに分類されます。1つは、System.Webを再構成して、Response.Cookiesコレクションの使用とOWIN Cookieの上書きを回避することです。もう1つの方法は、影響を受けるOWINコンポーネントを再構成して、CookieをSystem.WebのResponse.Cookiesコレクションに直接書き込むことです。

  • 認証の前にセッションが確立されるようにする:System.WebとKatanaのCookie間の競合はリクエストごとに発生するため、認証フローの前に、アプリケーションが一部のリクエストでセッションを確立できる場合があります。これはユーザーが最初に到着したときに簡単に実行できるはずですが、後でセッションまたは認証Cookieの有効期限が切れたときや更新が必要になったときに保証するのが難しい場合があります。
  • SessionStateModuleを無効にする-アプリケーションがセッション情報に依存していないが、セッションモジュールがまだ上記の競合を引き起こすCookieを設定している場合は、セッション状態モジュールを無効にすることを検討してください。
  • System.WebのCookieコレクションに直接書き込むようにCookieAuthenticationMiddlewareを再構成します。
app.UseCookieAuthentication(new CookieAuthenticationOptions
                                {
                                    // ...
                                    CookieManager = new SystemWebCookieManager()
                                });

ドキュメントからのSystemWebCookieManagerの実装を参照してください(上記のリンク)

詳細はこちら

編集する

問題を解決するために取った手順の下に。1.と2.はどちらも問題を個別に解決しましたが、念のため両方を適用することにしました。

1. SystemWebCookieManagerを使用します

2.セッション変数を設定します。

protected override void Initialize(RequestContext requestContext)
{
    base.Initialize(requestContext);

    // See http://stackoverflow.com/questions/20737578/asp-net-sessionid-owin-cookies-do-not-send-to-browser/
    requestContext.HttpContext.Session["FixEternalRedirectLoop"] = 1;
}

(補足:上記の初期化メソッドは、base.Initializeがセッションを使用可能にするため、修正の論理的な場所です。ただし、OpenIdには最初に匿名リクエストがあり、次にOpenIdプロバイダーにリダイレクトしてから戻るため、修正を後で適用することもできます。アプリへのリダイレクト後に問題が発生しますが、修正は最初の匿名リクエスト中にすでにセッション変数を設定しているため、リダイレクトバックが発生する前に問題が修正されます)

編集2

Katanaプロジェクト 2016-05-14 からコピーして貼り付け:

これを追加:

app.UseCookieAuthentication(new CookieAuthenticationOptions
                                {
                                    // ...
                                    CookieManager = new SystemWebCookieManager()
                                });

...この:

public class SystemWebCookieManager : ICookieManager
{
    public string GetRequestCookie(IOwinContext context, string key)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);
        var cookie = webContext.Request.Cookies[key];
        return cookie == null ? null : cookie.Value;
    }

    public void AppendResponseCookie(IOwinContext context, string key, string value, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        var webContext = context.Get<HttpContextBase>(typeof(HttpContextBase).FullName);

        bool domainHasValue = !string.IsNullOrEmpty(options.Domain);
        bool pathHasValue = !string.IsNullOrEmpty(options.Path);
        bool expiresHasValue = options.Expires.HasValue;

        var cookie = new HttpCookie(key, value);
        if (domainHasValue)
        {
            cookie.Domain = options.Domain;
        }
        if (pathHasValue)
        {
            cookie.Path = options.Path;
        }
        if (expiresHasValue)
        {
            cookie.Expires = options.Expires.Value;
        }
        if (options.Secure)
        {
            cookie.Secure = true;
        }
        if (options.HttpOnly)
        {
            cookie.HttpOnly = true;
        }

        webContext.Response.AppendCookie(cookie);
    }

    public void DeleteCookie(IOwinContext context, string key, CookieOptions options)
    {
        if (context == null)
        {
            throw new ArgumentNullException("context");
        }
        if (options == null)
        {
            throw new ArgumentNullException("options");
        }

        AppendResponseCookie(
            context,
            key,
            string.Empty,
            new CookieOptions
            {
                Path = options.Path,
                Domain = options.Domain,
                Expires = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc),
            });
    }
}

私はこの答えがずっと簡単で問題を修正するのが簡単だと思います。ありがとう-たぶん私は急に話しすぎました。これは私の問題を解決しませんでした。
JCS 2016年

@JCS問題を解決するために実行した手順が含まれています。問題が関連しているかどうかを確認しましたか?
thomius

認証のセッション管理にWeb Api 2 + Owinミドルウェア+ redisキャッシュを使用しています。SystemWebCookieManagerを使用しようとしましたが、認証Cookieが設定されていないという問題を解決できませんでした。「UseKentorOwinCookieSaver」を使用して解決しましたが、余分な外部依存関係があまり好きではありません...
JCS

セッションのクリアは私にとってはうまくいきました。外部依存関係は必要ありません。を呼び出す前に、これControllerContext.HttpContext.Session.RemoveAll();ExternalLogin()アクションに入れてくださいChallengeResult()。それが最善の解決策かどうかはわかりませんが、それが最も簡単です。
Alisson

1
@chemitaxis確かに、?.(null条件演算子)はC#6でのみ機能することに注意してください
Alisson

5

回答はすでに提供されていますが、owin 3.1.0では、使用できるSystemWebChunkingCookieManagerクラスがあります。

https://github.com/aspnet/AspNetKatana/blob/dev/src/Microsoft.Owin.Host.SystemWeb/SystemWebChunkingCookieManager.cs

https://raw.githubusercontent.com/aspnet/AspNetKatana/c33569969e79afd9fb4ec2d6bdff877e376821b2/src/Microsoft.Owin.Host.SystemWeb/SystemWebChunkingCookieManager.cs

app.UseCookieAuthentication(new CookieAuthenticationOptions
{
    ...
    CookieManager = new SystemWebChunkingCookieManager()
    ...
});

これはまだ3.1.0の問題ですか?
cyberconte 2017

1
はい、それは私にとって3.1.0の問題であり、このcookieマネージャーが必要でした。デフォルトはまだChunkingCookieManagerであるためです。
jonmeyer 2017

どこで使用できますか?そしてどうやって?
Simon_Weaver

@jonmeyerありがとう。昨日はSystemCCMとCCMの違いを見逃していたと思いますので、間違いなくこれをチェックします
Simon_Weaver

上記の行を追加した後でも、機能しません。3.1.0バージョンを使用しています。主に初めてログインできますが、ログアウト後はログインできません。
Mitin Dixit

3

自分でOWINミドルウェアにCookieを設定している場合、使用するOnSendingHeadersと問題が解決するようです。

たとえば、以下のコードを使用owinResponseCookie2すると設定されますが、そうでowinResponseCookie1はありません。

private void SetCookies()
{
    var owinContext = HttpContext.GetOwinContext();
    var owinResponse = owinContext.Response;

    owinResponse.Cookies.Append("owinResponseCookie1", "value1");

    owinResponse.OnSendingHeaders(state =>
    {
        owinResponse.Cookies.Append("owinResponseCookie2", "value2");
    },
    null);

    var httpResponse = HttpContext.Response;
    httpResponse.Cookies.Remove("httpResponseCookie1");
}

3

私は同様の問題に直面したのVisual Studio 2017.NET MVC 5.2.4 Nuget更新、Microsoft.Owin.Security.Googleを現在最新のバージョンに4.0.1私のために働きました!これが誰かを助けることを願っています!


1
これで私のベーコンを救った!Android Chromeで特にランダムに認証が失われる問題がありました。このスレッドの他の何も機能しませんでした。私はVS2019とASP MVC 5を使用しています
zfrank

2

最速の1行コードソリューション:

HttpContext.Current.Session["RunSession"] = "1";

CreateIdentityメソッドの前に次の行を追加するだけです。

HttpContext.Current.Session["RunSession"] = "1";
var userIdentity = userManager.CreateIdentity(user, DefaultAuthenticationTypes.ApplicationCookie);
_authenticationManager.SignIn(new AuthenticationProperties { IsPersistent = rememberLogin }, userIdentity);

1
このコードをどこに配置しますHttpContext.Current.Session["RunSession"] = "1";か?でGloba.asax Session_Start
Kiquenet

1
それは実際に利用可能な最も単純で最速のソリューションであり、その問題のソリューションはフレームワークに含まれなくなります(すでに発表される予定です)。 。このソリューションはIMHOを過小評価しています。
Der Zinger 2016年

私はAuthManagerのIssueAuthTokenメソッドの上部に追加しました
Alexander

1

Set-Cookieヘッダーが送信されないという同じ症状がありましたが、これらの回答のどれも役に立ちませんでした。すべてが私のローカルマシンで機能しましたが、実稼働環境にデプロイすると、set-cookieヘッダーが設定されませんでした。

CookieAuthenticationMiddlewareWebApiでのカスタムの使用とWebApi圧縮サポートの組み合わせであることがわかりました

幸いにも、プロジェクトでELMAHを使用していたため、この例外がログに記録されていました。

System.Web.HttpExceptionサーバーは、HTTPヘッダーが送信された後にヘッダーを追加できません。

私をこのGitHubの問題に導いた

基本的に、私のような奇妙な設定がある場合は、Cookieを設定するWebApiコントローラー/メソッドの圧縮無効にするか、を試してくださいOwinServerCompressionHandler

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.