Web API 2 OWIN Bearer Token cookie的用途?

Posted

技术标签:

【中文标题】Web API 2 OWIN Bearer Token cookie的用途?【英文标题】:Web API 2 OWIN Bearer Token purpose of cookie? 【发布时间】:2014-01-22 12:00:01 【问题描述】:

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

根据这篇文章:

OWIN Bearer Token Authentication with Web API Sample

public override async Task GrantResourceOwnerCredentials(OAuthGrantResourceOwnerCredentialsContext context)

    using (IdentityManager identityManager = _identityManagerFactory.CreateStoreManager())
    
        if (!await identityManager.Passwords.CheckPasswordAsync(context.UserName, context.Password))
        
            context.SetError("invalid_grant", "The user name or password is incorrect.");
            return;
        

        string userId = await identityManager.Logins.GetUserIdForLocalLoginAsync(context.UserName);
        IEnumerable<Claim> claims = await GetClaimsAsync(identityManager, userId);
        ClaimsIdentity oAuthIdentity = CreateIdentity(identityManager, claims,
            context.Options.AuthenticationType);
        ClaimsIdentity cookiesIdentity = CreateIdentity(identityManager, claims,
            _cookieOptions.AuthenticationType);
        AuthenticationProperties properties = await CreatePropertiesAsync(identityManager, userId);
        AuthenticationTicket ticket = new AuthenticationTicket(oAuthIdentity, properties);
        context.Validated(ticket);
        context.Request.Context.Authentication.SignIn(cookiesIdentity);
    

GrantReourceOwnerCredentials 函数不仅使用以下行组成票证: context.Validated(ticket);但它也组成一个 cookie 身份,并使用以下行将其设置为 cookie: context.Request.Context.Authentication.SignIn(cookiesIdentity);

所以我的问题是,这个函数中 cookie 的确切用途是什么? AuthenticationTicket 不应该足以用于身份验证吗?

【问题讨论】:

您所指的帖子链接已更改,现在是blogs.msdn.microsoft.com/webdev/2013/09/20/… 【参考方案1】:

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

如果你查看 WebApiConfig.Register 方法,你会看到这行代码:

    config.SuppressDefaultHostAuthentication();

这告诉 Web API 忽略 cookie 身份验证,这避免了the link you posted in your question 中解释的一系列问题:

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

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

【讨论】:

补充一点,在 CookieAuthenticationOptions 中有一个名为 CookieHttpOnly 的字段。如果您将此设置为 true,则浏览器根本不会将 cookie 与 javascript 生成的 API 请求一起发送,从而在调试时为您节省一些带宽和潜在的混乱。 您所说的“MVC 控制器将继续使用 cookie 身份验证...”是什么意思?使用这行代码 config.SuppressDefaultHostAuthentication() 我可以在 MVC 应用程序中使用 cookie 身份验证,在移动应用程序中使用 Bearer Token 身份验证? @mmarques 我想你回答了你自己的问题。 MVC 将使用 cookie 身份验证,Web API 将使用上面配置的不记名令牌身份验证。 @ThisGuy 无论如何,默认值都是 true,尽管提及它是值得称赞的。 @Tony 因为您必须在每个请求上手动添加不记名令牌标头。将您带到经过身份验证的页面的计划旧锚标记不起作用。域的 Cookie 会与请求一起自动发送。【参考方案2】:

cookie 的存在也让我很疑惑,因为在不记名令牌认证场景中它显然不是必需的......在this 的帖子中,作者剖析了个人账户模板,并有以下关于 cookie 的说法:

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

我的猜测是,模板的作者想要展示不同类型的身份验证逻辑的示例,在这种特殊情况下,他们还想展示身份验证信息如何存储在不记名令牌身份验证 JSON 有效负载中就像在标准的身份验证 cookie 中一样。

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

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

模板的作者似乎想提供一些有用的示例,而不是实现不记名令牌认证所需的最低限度。上面链接的帖子中也提到了这一点。

【讨论】:

那位作者 (***.com/users/672453/leastprivilege) 也恰好对这个话题略知一二。他是 Thinktecture.IdentityServer 和这篇关于 Claims-Based Identity (msdn.microsoft.com/en-us/library/ff423674.aspx) 的 MS 论文的作者【参考方案3】:

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

【讨论】:

以上是关于Web API 2 OWIN Bearer Token cookie的用途?的主要内容,如果未能解决你的问题,请参考以下文章

Web API 2,OWIN 身份验证,SignOut 不注销

无法设置 OWIN + OneLogin + Bearer

从 OWIN 中的 OAuth Bearer Token 获取 IPrincipal

Asp.Net Web API 2第十课——使用OWIN自承载Web API

如何使用 OWIN Jwt Bearer Authentication 记录身份验证结果

在 WebAPI 的查询字符串中传递和验证 OWIN Bearer 令牌