如何生成承载令牌以调用远程Web API

时间:2014-07-21 03:23:53

标签: owin asp.net-web-api2 asp.net-identity-2 bearer-token

我有两个网站,一个网站,用户登录并管理他们的帐户和没有用户界面的网站,只不过是一个存储和检索内容的API。这两个站点都使用相同的Owin ASP.Net Identity 2.0设置。由于显而易见的原因,UI站点使用cookie,API站点使用Bearer令牌。我需要能够使用当前用户身份验证从UI站点调用API方法/ URL。简而言之,我需要在UI站点中生成有效的Bearer令牌,以便在进行Rest API调用时添加到HTTP头。

我一直在寻找一种方法来使用“可信”的客户端身份验证并调用API的/ Token url来生成Bearer令牌,或者因为两个站点共享相同的代码而用户表调用Owin方法来生成UI站点代码中的Bearer Token,我可以将其传递给API标头,API站点将其视为有效令牌。

如果您需要更多信息,请告诉我。

更新:请参阅下面的更新回答,并使用oAuth Implicit flow正确执行此操作。

1 个答案:

答案 0 :(得分:13)

我最终找到了这篇文章,并按照其示例代码创建了我们自己的OAuth授权服务器。有了它,我们可以代表用户使用我们的UI站点和OAuth服务器之间共享的可信客户端ID和秘密来请求用户令牌。

http://www.asp.net/aspnet/overview/owin-and-katana/owin-oauth-20-authorization-server

更新1:在完成功能和事情的更多工作后,我偶然发现了创建令牌的内容。 Owin中有一个 TicketDataFormat 类可以完成所有的魔法。它在构造函数中接受一个参数,即 IDataProtector 。如果Owin资源服务器在其中间件选项中使用默认的AccessTokenFormat( TicketDataFormat );与默认的 DataProtector 一起,您可以在客户端复制令牌生成。顺便说一句,默认的 DataProtector 使用MachineKey,因此您的两个可信站点必须在web.config中设置相同的MachineKey。所有不受信任或部分受信任的站点都应使用上面链接中提到的标准oAuth流。

var protector = app.CreateDataProtector(typeof(OAuthAuthorizationServerMiddleware).Namespace, "Access_Token", "v1");
var tdf = new TicketDataFormat(protector);
var ticket = new AuthenticationTicket(){ ... };
var accessToken = tdf.Protect(ticket);

更新2:推荐的,实际上唯一的方法就是使用oAuth与客户端一起使用Implicit流程,并设置正确的范围和响应类型。

IdentityServer3文档有很好的文档教程,可以在很短的时间内启动并运行。特别是Calling the API on behalf of the User教程中的Getting Started: MVC Authentication & Web APIs部分。