Web API 2 OWIN Bearer令牌的目的是什么?

时间:2014-01-04 21:28:39

标签: asp.net-mvc-5 owin katana asp.net-web-api2

我试图了解MVC 5中单页应用模板中新的OWIN承载令牌认证过程。如果我错了请纠正我,对于OAuth密码客户端认证流程,承载令牌认证通过检查http来工作承载访问令牌代码的授权请求标头,以查看请求是否经过身份验证,它不依赖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不应该足以用于身份验证吗?

3 个答案:

答案 0 :(得分:36)

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

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

    config.SuppressDefaultHostAuthentication();

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

  

&#34; ... SPA模板也可以将应用程序cookie中间件作为活动模式,以启用其他方案,如MVC身份验证。因此,如果请求具有会话cookie但没有持有者令牌,则仍将对Web API进行身份验证。这可能不是你想要的,因为你会对你的API的CSRF攻击感到尊敬。另一个负面影响是,如果请求未经授权,则两个中间件组件都将对其应用挑战。 cookie中间件将改变对302的401响应以重定向到登录页面。这也不是您在Web API请求中想要的内容。&#34;

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

答案 1 :(得分:3)

cookie的存在也让我感到困惑,因为在承载令牌认证场景中显然没有必要......在this帖子中,作者剖析个人账户模板,并且有以下说明:饼干:

  

该方法还设置应用程序cookie。我认为没有充分的理由。

我的猜测是模板的作者希望展示不同类型的身份验证逻辑的示例,在这种特殊情况下,他们希望展示如何将身份验证信息存储在承载令牌身份验证JSON有效负载中,以及与标准身份验证cookie一样。

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

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

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

答案 2 :(得分:0)

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