13

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

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

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

更新:请参阅下面的更新答案以及使用 oAuth 隐式流执行此操作的正确方法。

4

1 回答 1

14

我最终找到了这篇文章,并按照它的示例代码创建了我们自己的 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 与您的客户端一起使用隐式流,并设置正确的范围和响应类型。

IdentityServer3文档有很好的文档记录教程,可以让我们在很短的时间内启动并运行。特别是在入门:MVC 身份验证和 Web API教程中代表用户调用 API部分。

于 2014-08-16T04:57:57.610 回答