修改OWIN OAuth中间件以使用JWT承载令牌

时间:2014-03-05 15:09:24

标签: c# owin asp.net-web-api2 jwt

我目前正在尝试使用以下技术的组合为新应用程序创建基于声明的身份验证的概念验证: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))

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

非常感谢任何想法。

4 个答案:

答案 0 :(得分:6)

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

所以,而不是:

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

你应该:

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

答案 1 :(得分:4)

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

然而,在2014年下半年,微软正式发布了JSON Web Token Handler在Windows身份基础上对JWT的支持。您应该能够安装并使用该软件包来解决您所描述的问题。

答案 2 :(得分:0)

我不认为现有的方式可以覆盖令牌在响应中的输出方式。我看了一下Katana source code repository中的OAuthAuthorizationServerHandler。

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

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

答案 3 :(得分:-2)

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

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