web-dev-qa-db-ja.com

ベアラートークンとCookie認証を一緒に使用する

私は単一ページのアプリを持っています-MVC5 SPAテンプレートにほぼ基づいています-認証にベアラートークンを使用しています。

このサイトには、セキュリティ保護が必要な従来のMVCページもいくつかありますが、cookie authenticationを使用しています。

Startup.Authでは、両方のタイプの認証を有効にできます。

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthBearerTokens(OAuthOptions);

ただし、これは、AJAXリクエストがSPAから送信されるたびに、ヘッダー内のベアラトークンの両方を送信するという副作用がありますand Cookie 。

私が本当に望んでいる動作は、onlyということです。WebAPI呼び出しにはベアラートークンが使用され、MVC呼び出しにはcookieのみが使用されます。

また、認可されていない場合(CookieAuthenticationOptionとして設定されている場合)、ログインページにリダイレクトするMVC呼び出しが必要ですが、API呼び出しを行うときにこれが発生しないようにする必要はありません。

1つのアプリケーション内でこのタイプの混合モード認証を使用する方法はありますか?おそらくパス/ルートフィルターを介してですか?

63
Appetere

私はこれを解決したと思う:-

Startup.AuthはOWINパイプラインを接続しているので、そこにCookieとトークンを含めるのは正しいことです。ただし、Cookieオプションの1つの変更により、適用する認証タイプが指定されます。

CookieOptions = new CookieAuthenticationOptions
{
  AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie   
};

次に、トークンのみを使用するようにWebAPIを構成する必要がありました。

public static void Configure(HttpConfiguration config)
{
   // Configure Web API to use only bearer token authentication.
   config.SuppressDefaultHostAuthentication();
   config.Filters.Add(new HostAuthenticationFilter(OAuthDefaults.AuthenticationType));
}

これは私が望むものを達成するようです。 WebAPIはベアラトークンのみを使用し、Cookieは使用しません。また、従来のMVCページのいくつかは、(AuthenticationManagerを使用して)ログインするとCookieを使用します。

46
Appetere

http-onlyモードでjwtトークンをcookie(ここではjwtトークンcookie名は「access_token」)に追加し、このようなミドルウェアを作成できます。

public class JwtCookieMiddleware
{
    private readonly RequestDelegate _next;

    public JwtCookieMiddleware(RequestDelegate next)
    {
        _next = next;
    }

    public Task Invoke(HttpContext ctx)
    {
        if (ctx.Request.Cookies.TryGetValue("access_token", out var accessToken))
        {
            if (!string.IsNullOrEmpty(accessToken))
            {
                string bearerToken = String.Format("Bearer {0}", accessToken);
                ctx.Request.Headers.Add("Authorization",bearerToken);
            }
        }
        return this._next(ctx);
    }
}
public static class JwtCookieMiddlewareExtensions
{
    public static IApplicationBuilder UseJwtCookie(this IApplicationBuilder build)
    {
        return build.UseMiddleware<JwtCookieMiddleware>();
    }
}

そして、次のように起動時にミドルウェアを使用する必要があります。

app.UseJwtCookie();
app.UseAuthentification();
app.UseMvc();

上記のコードは、このリクエストがトークンCookieを持つ場合、httpリクエストヘッダーにjwtトークンを追加します。

3
xiongkailing