Asp.net mvc 5 Web API 2 OWIN承载令牌cookie的用途?

Asp.net mvc 5 Web API 2 OWIN承载令牌cookie的用途?,asp.net-mvc-5,owin,katana,asp.net-web-api2,Asp.net Mvc 5,Owin,Katana,Asp.net Web Api2,我试图理解MVC5中单页应用程序模板中新的OWIN承载令牌身份验证过程。如果我错了,请纠正我,对于OAuth密码客户端身份验证流,承载令牌身份验证通过检查http授权请求头中的承载访问令牌代码来检查请求是否经过身份验证,而不依赖cookie来检查特定请求是否经过身份验证 根据这篇文章: public override异步任务GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext) { 使用(Identity

我试图理解MVC5中单页应用程序模板中新的OWIN承载令牌身份验证过程。如果我错了,请纠正我,对于OAuth密码客户端身份验证流,承载令牌身份验证通过检查http授权请求头中的承载访问令牌代码来检查请求是否经过身份验证,而不依赖cookie来检查特定请求是否经过身份验证

根据这篇文章:

public override异步任务GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext)
{
使用(IdentityManager IdentityManager=_IdentityManager.CreateStoreManager())
{
如果(!await identityManager.Passwords.CheckPasswordAsync(context.UserName,context.Password))
{
SetError(“无效的授权”,“用户名或密码不正确”);
返回;
}
字符串userId=await identityManager.Logins.GetUserIdForLocalLoginAsync(context.UserName);
IEnumerable claims=wait GetClaimsAsync(identityManager,userId);
ClaimsIdentity oAuthIdentity=CreateIdentity(identityManager、索赔、,
context.Options.AuthenticationType);
ClaimSideEntity cookiesIdentity=CreateIdentity(identityManager、索赔、,
_cookieOptions.AuthenticationType);
AuthenticationProperties=await CreatePropertiesAsync(identityManager,userId);
AuthenticationTicket=新的AuthenticationTicket(OAuthidentitity,属性);
上下文。已验证(票证);
context.Request.context.Authentication.sign(cookiesIdentity);
}
}
GrantResourceOwnerCredentials函数不仅使用以下行组成票据:context.Validated(票据);但它也组成一个cookie标识,并使用以下行将其设置为cookie:context.Request.context.Authentication.sign(CookieIdentity)


所以我的问题是,这个函数中cookie的确切用途是什么?AuthenticationTicket对于身份验证来说是否足够好呢?

cookie的存在也让我感到困惑,因为在承载令牌身份验证场景中它显然是不必要的。。。在本文中,作者剖析了个人帐户模板,并对cookie进行了以下说明:

该方法还设置应用程序cookie。我看不出有什么好的理由

我的猜测是,模板的作者希望展示不同类型的身份验证逻辑的示例,在这个特定的案例中,他们希望展示如何将身份验证信息存储在承载令牌身份验证JSON负载以及标准身份验证cookie中

JSON身份验证有效负载被设置为除了加密票据之外还包含一个额外(不必要的)未加密属性(用户id),这一事实似乎支持了这一理论:

var properties = CreateProperties(user.UserName);
var ticket = new AuthenticationTicket(oAuthIdentity, properties);

模板的作者似乎想提供一些有用的示例,而不是实现承载令牌身份验证所需的最低限度。上面的链接文章中也提到了这一点。

在SPA模板中,实际上启用了两种独立的身份验证机制—cookie身份验证和令牌身份验证。这允许对MVC和Web API控制器操作进行身份验证,但需要一些额外的设置

如果查看WebApiConfig.Register方法,您将看到以下代码行:

    config.SuppressDefaultHostAuthentication();
这告诉Web API忽略cookie身份验证,从而避免了大量问题,这些问题将在以下部分中解释:

“…SPA模板将应用程序cookie中间件作为活动模式启用,以便启用其他场景,如MVC身份验证。因此,如果请求具有会话cookie,但没有承载令牌,则Web API仍将进行身份验证。这可能不是您想要的,因为您会尊重API的CSRF攻击。另一个负面影响是,如果请求未经授权,两个中间件组件都将对其应用挑战。cookie中间件将401响应更改为302,以重定向到登录页面。这也不是您在Web API请求中想要的。”


因此,现在通过调用
config.SuppressDefaultHostAuthentication()
Web API,需要授权的调用将忽略随请求自动发送的cookie,并查找以“Bearer”开头的授权标头“.MVC控制器将继续使用cookie身份验证,并且不知道令牌身份验证机制,因为它一开始就不太适合网页身份验证。

cookie有一个重要的用途。其值包含可由页面上的客户端javascript提取的承载令牌。这意味着,如果用户点击F5或刷新页面,cookie通常会保持不变。然后,当页面重新加载时,客户端javascript可以从cookie中获取承载令牌。

该作者()也恰好对该主题略知一二。他是Thinktecture.IdentityServer的作者,这篇关于基于声明的身份的MS论文()为了补充这一点,CookieAuthenticationOptions中有一个名为CookieHttpOnly的字段。如果您将此设置为true,浏览器将根本不会发送带有JavaScript生成的API请求的cookie,从而为您节省一些带宽和调试时可能出现的混乱。您所说的“MVC控制器将继续使用cookie身份验证…”是什么意思?有了这行代码config.SuppressDefaultHostAuthentication(),我可以在MVC应用程序中使用cookies身份验证,在移动应用程序中使用承载令牌身份验证?@mmarques我想你回答了你自己的问题。MVC将使用cookie身份验证,Web API将使用上述配置的承载令牌身份验证。@ThisGuy默认值无论如何都是真的,不过值得称赞的是提到了它。@Tony,因为您必须手动添加