同时使用无记名标记和 Cookie 身份验证

我有一个单页应用程序-或多或少基于 MVC5 SPA 模板-使用 无记名代币进行身份验证。

该网站还有一对夫妇传统的 MVC 页面,需要加以保护,但使用 Cookie 认证

在 Startup. Auth 中,我可以启用两种授权类型:

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

但是,这似乎有一个副作用,无论什么时候从 SPA 发送 AJAX 请求,它都会将头 还有中的持有者标记发送给 cookie。

而我真正想要的行为是,只有持有者令牌用于 WebAPI 调用,而只用于 MVC 调用的 cookie。

我还希望 MVC 调用在未经授权时重定向到登录页面(设置为 CookieAuthenticationOption) ,但显然我不希望在进行 API 调用时发生这种情况。

有没有什么方法可以在一个应用程序中实现这种类型的混合模式身份验证? 也许可以通过路径/路由过滤器?

37180 次浏览

我想我解决了这个问题

启动。Auth 连接了 OWIN 管道,因此在其中包含 Cookie 和令牌是正确的。但是对 cookie 选项的一个更改指定了它应该应用于的身份验证类型:

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)的 cookies。

您可以在 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.UseAuthentication();
app.UseMvc();

以上代码将添加 jwt 令牌到 http 请求头,如果该请求与令牌 cookie;