如何生成 Bearer 令牌以调用远程 Web API
Posted
技术标签:
【中文标题】如何生成 Bearer 令牌以调用远程 Web API【英文标题】:How do you generate a Bearer token to call a remote Web API 【发布时间】:2014-09-11 11:56:32 【问题描述】:我有两个站点,一个是用户登录并管理其帐户的站点,另一个是没有 UI 的站点,只不过是一个用于存储和检索内容的 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 站点代码中的不记名令牌,我可以将其传递给 API 标头,API 站点将其视为有效令牌。
如果您需要更多信息,请告诉我。
更新:请参阅下面的更新答案以及使用 oAuth 隐式流执行此操作的正确方法。
【问题讨论】:
是否有什么阻止您简单地使用 UI 网站上的 Cookie?我有一个类似的设置(MVC:Cookie Auth/Api:Basic Auth),只需检查我的 Api 身份验证中的 Cookie @PeekaySwitch 这在我们使用 MemberShipProvider 时有效,但它似乎不适用于 OAuth 令牌。 为什么投反对票?? 如果您要投反对票,请解释一下您自己。不要拒绝投票并运行...... 【参考方案1】:我最终找到了这篇文章,并按照它的示例代码创建了我们自己的 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,因此您的两个 trusted 站点必须在 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,在客户端使用隐式流,并设置正确的范围和响应类型。
IdentityServer3 文档有非常详细的文档说明,帮助我们在很短的时间内启动并运行。特别是Getting Started: MVC Authentication & Web APIs 教程中的Calling the API on behalf of the User 部分。
【讨论】:
以上是关于如何生成 Bearer 令牌以调用远程 Web API的主要内容,如果未能解决你的问题,请参考以下文章
如何从 .net 核心客户端生成 JWT Bearer Flow OAuth 访问令牌?
对 Bearer 令牌使用 JSON Web 令牌和 Firestore 支持