2016-07-18 1 views
15

私はthis tutorialに従っていますが、ログアウトする方法は教えていません。ただ、必要がある1つの以上のアクションOwin Providersからログアウトするには?

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

この方法プラス掲示Iの3行のいずれかを追加するhttps://github.com/AndersAbel/SocialLoginWithoutIdentity

:私は

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

Request.GetOwinContext().Authentication.SignOut() 

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

はあなたがここにサンプルコードを取得することができます実行しようとしました上記の

私の結果は今、私はログインして、私は安全なページに移動し、それを見ることができます、私はその後、私のサインアウトに進み、サインアウトした後、安全なページに戻ることができます。

実際には本当に私に署名しませんでした。

+0

ログアウトしませんか? – Win

+0

いいえ。私はログインせずに私の安全なページにアクセスすることができます。それはその中にすべてのクレームを持つクッキーを再現するようです。それは永遠に自動ログインにあるようなものです。 – chobo2

+0

http://stackoverflow.com/a/24611815/2850543 –

答えて

11

このチュートリアルで述べたように、デフォルトの認証タイプを使用しますが、それを上書きしません。あなたがそうするように、Googleのプロバイダを格納するために使用される1

を、AspのためにクッキーをクリアれていませんがOwin、あなたはすべての配列を取得する必要がありますのためのパラメータとしてのみexternalCookieを使用することにより

現在のクッキー。それは、このような簡単な方法を行うことができます :

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

それはチュートリアルに言われるところである:

それが必要なのはなぜUseGoogleAuthenticationへの呼び出しは非常に明白でなければなりません。

しかし、最初のtoSetDefaultSignInAsAuthenticationTypeは、 として明白ではありません。 ログインミドルウェアは通常、ソーシャルログインミドルウェアの前に登録された外部クッキーミドルウェア に依存しています。 外部のCookieミドルウェアで、デフォルトのサインインタイプとして設定されます。 ソーシャル・ログイン・ミドルウェアは、外部Cookie を使用する必要があることを知っています。 この設定には外部クッキーはありません。したがって、メインのクッキーミドルウェアをデフォルトのサインインタイプとして手動で設定するには があります。 認証タイプが、 ソーシャルログインミドルウェアによって作成されたIDと一致する場合にのみ、CookieミドルウェアはCookieを発行します。外部認証パイプラインowinを見てください。

+0

これは動作するようです。私はちょっと混乱してASP用のクッキーだけをクリアするのですか? 「デフォルトの認証タイプでは100%を意味しますが、それを上書きしない」とはどういう意味ですか?私は外部CookieがGoogleのようなもので作られたCookieを実際に参照していると思っていました。 Aspのクッキーではありません。 – chobo2

+0

申し訳ありませんが、私の母国語ではありませんので、意味がわからないかもしれませんが、このparagrapheのリンクで説明されています: – GaelSa

+0

arfインターネットの問題です。チュートリアルで。 – GaelSa

1

の承認を必要とするクラスの[オーソライズ]属性を使用します。

[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

私は私のものには今問題のないタグを承認しています。問題は私がチュートリアルに従っていて、サインアウトメソッドを追加したことです(2行のコードがあり、3つはOPの中にあり、ホームページにリダイレクトされます)。サインアウトをクリックしてから安全なページに戻ると、実際にログアウトする必要があるにもかかわらず、そのセキュリティ保護されたページにアクセスできます。実際に私をログアウトさせることはありません。 – chobo2

+1

なぜ否定的な投票ですか?この質問の冒頭では、問題がログアウトしているか、ページが保護されていないかは不明でした。 –

3

は、キャッシュコントロールヘッダを設定してみてください。

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を無効にすることができない限り、ユーザーがブラウザの[戻る]ボタンをクリックするのを停止することはありません。ユーザーはページを戻って前のページにあったものを見ることができますが、保護されたリンクをクリックしたりページを更新しようとすると、それらはリダイレクトされてログインします。

関連する問題