web-dev-qa-db-ja.com

Owinプロバイダーからログアウトする方法は?

私は このチュートリアル をフォローしていますが、ログアウトする方法を示していません。やってみた

Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);

Request.GetOwinContext().Authentication.SignOut()

          Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ApplicationCookie);

ここでサンプルコードを取得できます: https://github.com/AndersAbel/SocialLoginWithoutIdentity

アクションを1つ追加するだけです

public ActionResult SignOut()
 {
       Request.GetOwinContext().Authentication.SignOut(Microsoft.AspNet.Identity.DefaultAuthenticationTypes.ExternalCookie);
       return RedirectToAction("Index", "Home");
 }

この方法に加えて、上記で投稿した3行のいずれか

私の現在の結果は、ログインして、セキュリティで保護されたページに移動してそれを見ることができます。その後、サインアウトに進み、サインアウト後に安全なページに戻ろうとすると、その安全なページに戻ることが許可されます。

したがって、実際にはサインアウトされませんでした。

17
chobo2

チュートリアルで述べたように、使用されるミドルウェアはデフォルトの認証タイプを使用しますが、それを上書きしません。

OwinのパラメーターとしてexternalCookieのみを使用すると、AspのCookieがクリアされますが、Googleプロバイダーの格納に使用されるCookieはクリアされません

そのためには、現在のすべてのCookieの配列を取得する必要があります。次のような簡単な方法で実行できます。

Request.GetOwinContext()
       .Authentication
       .SignOut(HttpContext.GetOwinContext()
                           .Authentication.GetAuthenticationTypes()
                           .Select(o => o.AuthenticationType).ToArray());

これが チュートリアル で述べられているところです:

UseGoogleAuthenticationの呼び出しは、なぜそれが必要なのかが非常に明白である必要があります。

しかし、最初にSetDefaultSignInAsAuthenticationTypeを指定することはそれほど明白ではありません。ログインミドルウェアは通常、ソーシャルログインミドルウェアの前に登録された外部cookieミドルウェアに依存します。外部cookieミドルウェアは、それ自体をデフォルトのサインインタイプとして設定します。これが、ソーシャルログインミドルウェアが外部Cookieを使用する必要があることを認識する方法です。 この設定では外部Cookieがないため、メインのCookieミドルウェアをデフォルトのサインインタイプとして手動で設定する必要があります。Cookieミドルウェアは、 AuthenticationTypeがソーシャルログインミドルウェアによって作成されたIDの1つと一致する場合のCookie。owin外部認証パイプラインを見て、ソーシャル

18
GaelSa

キャッシュ制御ヘッダーを設定してみてください。

public ActionResult SignOut() {
    var authenticationTypes = new string[] {
        DefaultAuthenticationTypes.ApplicationCookie,  
        DefaultAuthenticationTypes.ExternalCookie 
    };
    AuthenticationManager.SignOut(authenticationTypes);
    // HACK: Prevent user from being able to go back to a logged in page once logged out
    Response.Cache.SetExpires(DateTime.UtcNow.AddMinutes(-1));
    Response.Cache.SetCacheability(HttpCacheability.NoCache);
    Response.Cache.SetNoStore();
    // now redirect
    return RedirectToAction("Index", "Home");    
}

private IAuthenticationManager AuthenticationManager {
    get {
        return Request.GetOwinContext().Authentication;
    }
}

JavaScriptを無効にしない限り、ユーザーがブラウザの戻るボタンをクリックするのを止めることはできません。ユーザーはページに戻って前のページの内容を表示できますが、保護されたリンクをクリックするか、ページを更新しようとすると、ログインにリダイレクトされます。

4
Nkosi

承認が必要なクラスで[Authorize]属性を使用します。

 [Authorize]
public class MeController : ApiController
{
    // GET api/<controller>
    public IEnumerable<object> Get()
    {
        var identity = User.Identity as ClaimsIdentity;
        return identity.Claims.Select(c => new
        {
            Type = c.Type,
            Value = c.Value
        });
    }
}

ソース: http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

0