一起使用承载令牌和cookie身份验证

App*_*ere 65 asp.net-mvc oauth-2.0 asp.net-web-api owin

我有一个单页应用程序 - 或多或少基于MVC5 SPA模板 - 使用承载令牌进行身份验证.

该网站还有一些传统的MVC页面需要保护,但使用cookie身份验证.

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

app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOAuthBearerTokens(OAuthOptions);
Run Code Online (Sandbox Code Playgroud)

但是,这似乎有副作用,因为无论何时从SPA发送AJAX请求,它都会在标头 cookie中发送承载令牌.

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

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

有没有办法在一个应用程序中进行这种类型的混合模式身份验证?也许通过路径/路由过滤器?

App*_*ere 47

我想我是这样做的: -

Startup.Auth正在连接OWIN管道,因此在那里包含Cookies和令牌是正确的.但是对cookie选项的一个更改指定了它应该应用于的身份验证类型:

CookieOptions = new CookieAuthenticationOptions
{
  AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie   
};
Run Code Online (Sandbox Code Playgroud)

然后我需要将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));
}
Run Code Online (Sandbox Code Playgroud)

这似乎实现了我想要的.WebAPI只使用承载令牌而不使用cookie,一些常规MVC页面在登录后使用cookie(使用AuthenticationManager).

  • 顺便说一句,CookieAuthenticationOptions中还有一个名为"CookieHttpOnly"的选项,它会阻止JavaScript将cookie传递给您的API. (4认同)
  • @Steve,只想澄清一件事.您是否在SPA和MVC部件中使用单独的登录页面?或者你能通过单一登录页面实现这一目标?如果是这样的话你怎么做? (4认同)
  • @ThisGuy这是不正确的."CookieHttpOnly"只会阻止在JavaScript中读取cookie的值,它不会*阻止cookie在AJAX请求中发送. (3认同)
  • 对于那些想知道为什么无法发现SuppressDefaultHostAuthentication()和HostAuthenticationFilter的人:你需要安装这个包:通过nuget:`Install-Package Microsoft.AspNet.WebApi.Owin` (3认同)
  • 史蒂夫,我会做同样的事情.我担心的一个问题是cookie和令牌(即本地存储)不同步.换句话说,cookie和令牌是否需要同时到期,还是有机制在缺少一个或另一个时优雅地处理? (2认同)