web-dev-qa-db-ja.com

HttpContext.Authentication.SignOutAsyncは認証Cookieを削除しません

ASP.NET Core documentation によると、メソッドHttpContext.Authentication.SignOutAsync()は認証Cookieも削除する必要があります。

サインアウト

現在のユーザーをサインアウトし、Cookieを削除するには(italics mine-A.C.)コントローラー内で次を呼び出します

await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");

しかし、そうではありません!それ以外はすべて大丈夫なようです。ユーザーが正しくサインインし、Cookie .AspNetCoreを取得するため、認証スキーム。創造された。

ユーザーのサインアウト後にCookieが残る理由はありますか?

16

伝えるのに十分なコードを投稿しませんでしたが、SignOutAsyncを呼び出した後、RedirectToActionが発行しようとするOIDCエンドセッションURLへのリダイレクトを上書きする何らかのタイプのリダイレクト(たとえば、SignOutAsync)があると思います。

(リダイレクト上書き問題についての同じ説明は、MicrosoftのHaoKによって here で与えられています。)

編集:上記の推測が正しい場合、解決策は、最後のAuthenticationPropertiesを使用して、SignOutAsyncオブジェクトでリダイレクトURLを送信することです。

// in some controller/handler, notice the "bare" Task return value
public async Task LogoutAction()
{
    // SomeOtherPage is where we redirect to after signout
    await MyCustomSignOut("/SomeOtherPage");
}

// probably in some utility service
public async Task MyCustomSignOut(string redirectUri)
{
    // inject the HttpContextAccessor to get "context"
    await context.SignOutAsync("Cookies");
    var prop = new AuthenticationProperties()
    {
        RedirectUri = redirectUri
    });
    // after signout this will redirect to your provided target
    await context.SignOutAsync("oidc", prop);
}
11
McGuireV10

私は同じ問題を抱えています。 SignOutAsyncは正常に機能しません。

私はこれを見つけました:

Response.Cookies.Delete(".AspNetCore.<nameofcookie>");
2
Castro JR

次のスニペットをコントローラーのLogout()メソッドに配置して、サイトCookieを削除することで問題を解決しました。サイトで複数のCookieが作成されることがわかりました。

_// Delete the authentication cookie(s) we created when user signed in
            if (HttpContext.Request.Cookies[".MyCookie"] != null)
            {
                var siteCookies = HttpContext.Request.Cookies.Where(c => c.Key.StartsWith(".MyCookie"));
                foreach (var cookie in siteCookies)
                {
                    Response.Cookies.Delete(cookie.Key);
                }
            }
_

そして、Startup.csで:

_app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                AuthenticationScheme = "Cookies",
                LoginPath = new PathString("/Account/Login/"),
                AccessDeniedPath = new PathString("/Home/Index/"),
                AutomaticAuthenticate = true,
                AutomaticChallenge = true,
                CookieName = ".MyCookie"
            });
_

GoogleでOpenIdConnectを使用しているため、await HttpContext.Authentication.SignOutAsync("MyCookieMiddlewareInstance");を使用していないことに注意してください。

2
JTvermose

Cookieを削除するコードを次に示します(他に何も役に立たない場合は、ブルートフォースを使用します)。

await this.HttpContext.Authentication.SignOutAsync(<AuthenticationScheme>);

// ...

var cookie = this.Request.Cookies[<CookieName>];
if (cookie != null)
{
    var options = new CookieOptions { Expires = DateTime.Now.AddDays(-1) };
    this.Response.Cookies.Append(cookieName, cookie, options);
}

悪い、悪い、悪い!非常にいパッチのようです!しかし、動作します... :(

otherソリューション?

0