web-dev-qa-db-ja.com

Web API 2、OWIN認証、サインアウトがログアウトしない

私は、Bearerトークンを認証メカニズムとして使用することを目的とした研究を行っています(つまり、AngularJS UI、Web API [2]プロジェクトでOWINを介して認証します)。

ログインは正常に機能し、ロール情報などはすべて正常ですが、トークンを取得してログアウトできません。

私のスタートアップ構成はこれです:

OAuthOptions = new OAuthAuthorizationServerOptions() {
    TokenEndpointPath = new PathString("/Token"),
    Provider = new ApplicationOAuthProvider(PublicClientId),
    AccessTokenExpireTimeSpan = SESSION_TIMEOUT,
    AllowInsecureHttp = true
};

そして、私のログアウトアクションはこれだけです。

public HttpResponseMessage Logout() {
    var authentication = HttpContext.Current.GetOwinContext().Authentication;
    authentication.SignOut(DefaultAuthenticationTypes.ExternalBearer);

    return new HttpResponseMessage(HttpStatusCode.OK);
}

簡潔にするためにすべての認証を省略しましたが、トークンをセットアップするときにExternalBearerを使用していることを確認するために。

私のUIでは、ローカルストレージにトークンを保存しています(ここではCookieは関係していません。これは意図的な設計上の決定です)。つまり、UIにlogoutボタンがあり、Logoutアクションがヒットし、コードが正常に実行されます。

しかし、その後、承認が必要なAPIのアクションにヒットした場合、リクエストはまだ通過します(つまり、ユーザーはshouldログアウトしました。

私は本当に明らかなものを見逃している(初めてではない;-)か、ここでさらに基本的なことがあります-最後に私はこれが彼らの領域であることを知っているので@leastprivilegeにpingを送信しています。

どんな助けや洞察もありがたいことに受け取られます。


私が考えることができるのは、トークンがサーバー/ API側でステートレスであるため、期限切れまたはサインアウトできないことです。

その場合、私は次のいずれかができると思います:

a)過去に有効期限が切れる新しいトークンを作成する更新トークンを追加します-これでも機能しますか? -実際にそれをキャンセルすると、新しいトークンが発行されます...古いトークンは引き続き有効です

b)ベアラートークンをデータベースに保存し、毎回確認し、ログアウト時にトークンを削除します(自然にソルト、ハッシュなど)。ただし、これは単にステートフルサーバーを持つことに戻ってきました。

c)誰かが明示的にログアウトするときにローカルストレージからトークンを削除することができます(そして今後もします)が、a baddyができる場合、トークンはまだ技術的に有効ですトークンをインターセプトします。当然、上記のすべては終了します[〜#〜] ssl [〜#〜]とにかく、悪者/少女を禁止する必要があります

d)おそらくこれが、多くの人がBearerトークンを(ストレージメカニズムとして)Cookieに保存する理由です。したがって、少なくともログアウトすると、次回の更新でCookieは削除されます。

上記はちょっとしたブレインダンプであり、質問を先取りしたいだけです

30
toepoke.co.uk

OAuthは認証プロトコルではないため、サインアウトの概念はありません。クライアントのアクセストークンを削除します-それがすべてです。

サーバー側でトークンを無効にする場合は、一意のIDを追加してサービスを追跡します。そのようなものを手動で作成する必要があります。

37
leastprivilege

ここに美しい解決策があります: http://www.nakov.com/blog/2014/12/22/webapi-owin-identity-custom-login-service/ 。 Web APIのカスタムユーザーセッションの実装OAuth OWINおよび標準ASP.NET Identityに基づくベアラートークン認証(Microsoft.AspNet.Identity.EntityFramework)。ほとんどの人が期待するように機能します。

  • Web APIセッションは、非アクティブな状態が30分続くと終了します。
  • セッションの有効期間は、許可されたHTTPリクエストごとに30分延長されます。
  • ログアウトは正しく機能します。ログアウト後、ベアラーaccess_tokenは無効になります(取り消されます)。

完全に機能するソースコードはGitHubで入手できます。 https://github.com/SoftUni/SPA-with-AngularJS/tree/master/Ads-REST-Services

16
Svetlin Nakov

この質問は何年もの間ここにありました(そしてまた答えられました)が、私は自分の考えでチャイムを鳴らしたかっただけです。

私はあなたの(C)オプションに似ていますが、技術的にトークンはまだ有効ですが、10分または20分などのベアラーアクセストークンに短い有効期限を使用して、クライアントでトークンをログアウトして削除した場合、悪者は有効なトークンで遊ぶ有効期限の残りのみを持ちます。

実際には、これを長寿命の更新トークンと組み合わせて使用​​します。これにより、有効期限が切れ、再度認証することなくAPIリソースとの対話を続けたい場合に新しいベアラートークンを取得できます。

2
jaeyow

ベアラートークンがクライアント側に存在することを知っている限り、サーバー側の「ログアウト」機能が必要だとは思わない。クライアントのローカルストレージからトークンを削除するだけでログアウトできます。

1
Ghidello