修改 OWIN OAuth 中间件以使用 JWT 不记名令牌

Posted

技术标签:

【中文标题】修改 OWIN OAuth 中间件以使用 JWT 不记名令牌【英文标题】:Modifying OWIN OAuth middleware to use JWT bearer tokens 【发布时间】:2014-04-07 17:40:45 【问题描述】:

我目前正在尝试使用以下技术组合为新应用创建基于声明的身份验证的概念证明:Web API 2、OWIN 中间件和 JWT。

为了简单起见,我从 Web API 2 项目模板开始,并将身份验证更改为“个人用户帐户”。然后,我创建的示例客户端能够通过调用 /Token 获取令牌,并且能够使用 OAuth 持有者令牌调用示例端点。到目前为止,一切都很好。然后我将以下代码添加到 Startup.Auth.cs 以尝试启用 JwtBearerAuthentication:

    var jwtOptions = new JwtBearerAuthenticationOptions
    
        AllowedAudiences = audiences,
        IssuerSecurityTokenProviders = new[]  
            new SymmetricKeyIssuerSecurityTokenProvider(issuer, signingKey) 
    ;

    app.UseJwtBearerAuthentication(jwtOptions);

我预计 Web API 2 会开始从对 /Token 的调用中返回 JWT,但它似乎没有做任何事情。几天来我一直在努力解决这个问题,但没有成功,而且微软的文档也不是很及时。

我还尝试将以下内容添加到我的 OAuthAuthorizationServerOptions

AuthorizationCodeFormat = new JwtFormat(audience, new SymmetricKeyIssuerSecurityTokenProvider(issuer, signingKey))

我也可能试图做完全错误的事情。

任何想法都将不胜感激。

【问题讨论】:

我目前正在创建自己的 ISecureDataFormat 并将其分配给 AccessTokenFormat 您是否找到了一种方法来更改为使用您自己的自定义 ISecureDataFormat 实现来发布 JWT? 你解决过这个问题吗?我现在开始考虑做同样的事情。 @ChrisC 是的。最终创建了一个基于 ISecureDataFormat 的自定义 AccessTokenFormat。取消保护方法类似于以下内容:katanaproject.codeplex.com/SourceControl/latest#src/…,我们实现了适当的保护方法。 【参考方案1】:

好吧,现在OAuthAuthorizationServerOptions 上有一个设置,您可以指定访问令牌的格式,而不是授权代码,就像您在示例中所做的那样。

所以,而不是:

AuthorizationCodeFormat = new JwtFormat(audience, new SymmetricKeyIssuerSecurityTokenProvider(issuer, signingKey))

你应该有:

AccessTokenFormat = new JwtFormat(audience, new SymmetricKeyIssuerSecurityTokenProvider(issuer, signingKey))

【讨论】:

两个代码示例看起来相同,除了变量名。 @RobertGrant 是的,因为这个答案是说应该分配 AccessTokenFormat 属性而不是 AuthorizationCodeFormat 属性。也就是说,它们不是变量,而是来自对象初始值设定项的属性名称(对于 OAuthAuthorizationServerOptions 对象)。 @phoog 明白了。谢谢。【参考方案2】:

Windows Identity Foundation 使用专有令牌格式,而不是 JWT。您在上面看到的 JWT 代码是用于 消费 令牌,而不是生成它们。在ASP.NET forums 上有一个有用的讨论。

不过,在 2014 年下半年,微软正式发布了对 Windows Identity Foundation 中 JWT 的支持,JSON Web Token Handler。您应该能够安装和使用该软件包来解决您描述的问题。

【讨论】:

【参考方案3】:

我认为目前没有任何方法可以覆盖令牌在响应中的输出方式。我查看了 Katana source code repository 中的 OAuthAuthorizationServerHandler。

您会看到在 InvokeTokenEndpointAsync 方法中,有一个部分创建了一个生成响应的 JsonTextWriter。它不是以任何类型的扩展都会影响它的方式完成的。

我也觉得这很令人沮丧。 Microsoft 的库应该有一些方法可以轻松地覆盖响应序列化。您甚至无法将自己的自定义参数添加到响应中。

【讨论】:

【参考方案4】:

您可以使用此示例https://github.com/thinktecture/Thinktecture.IdentityModel/tree/master/samples/OAuth2/EmbeddedResourceOwnerFlow

用于在您的项目中编写身份验证逻辑。 之后,您必须为每个需要授权的控制器或动作添加 [Authorize] 属性(OWIN Katana 包含验证令牌、授权和其他一些有用的东西的逻辑)。

【讨论】:

给定的示例 URL 不针对基于 JWT 的身份验证。还是我错过了什么?

以上是关于修改 OWIN OAuth 中间件以使用 JWT 不记名令牌的主要内容,如果未能解决你的问题,请参考以下文章

使用Owin中间件搭建OAuth2.0认证授权服务器

扩展 Microsoft.Owin.Security

尝试通过 Postman 调用 OWIN OAuth 安全 Web Api 来获取 JWT 时出现“错误”:“unsupported_grant_type”

OWIN 安全 - 如何实现 OAuth2 刷新令牌

实施 Identity 2.1 + OWIN OAuth JWT 不记名令牌时如何从 Web API 控制器端点进行身份验证

授权角色 WebAPI oauth owin