我很难找到必须使用 DotNetOpenAuth
实现的场景以及我必须处理的特定流程的答案。
在下图中,我控制着 MVC 站点和 API。该 API 既是我的授权服务器,也是我的资源服务器。
用户名和密码流程
在用户在我的系统上创建本地帐户的情况下,这个过程相当明显,因为我正在处理用户名和密码凭据以将它们登录到站点,然后我可以将其传递到我的 token 端点,然后再将其传递给我的 token 端点。传递到我的授权服务器的 HandleTokenRequest
以便为我的客户端获取访问 token 和刷新 token ,然后开始访问资源。
OpenID 流程
我目前不知所措的流程是,如果用户决定使用他们的 Google 凭据(例如)登录我的网站。在这种情况下,我如何在 API 中从我自己的授权服务器向他们授予访问 token 和刷新 token ?
我将在对 API token 端点的请求中包含哪些内容?
我编写了自己的 API 客户端,它继承自 WebServerClient
类,该类是 DotNetOpenAuth
库的一部分。
我发现有一个名为 IServiceProviderTokenManager
的用于处理 token 的接口(interface),但它似乎用于 OpenID 提供程序场景,而不是像我这样的 API 客户端实现,所以我假设我需要编写一个自定义类来在客户端存储和检索我自己的 API token ,但也希望确认这一点?
值得一提的是,网站和 API 都可以完全访问同一个安全数据库,但只有 API 可以访问保存任何资源的数据库。
最佳答案
为了完整起见,我想用我的答案更新这个问题。
我最终所做的是将 Authorize
和 Token
端点移至我的 MVC 4 应用程序中,而不是将它们放在 API 本身中。
这样,当使用登录用户调用授权端点时(因此存在 ASP.NET FormsAuthentication cookie),当请求处理命中此代码时,可以获得授予的授权代码:
// Consider auto-approving if safe to do so.
if (((OAuth2AuthorizationServer)this.authorizationServer.AuthorizationServerServices).CanBeAutoApproved(pendingRequest))
{
var approval = this.authorizationServer.PrepareApproveAuthorizationRequest(pendingRequest, HttpContext.User.Identity.Name);
return this.authorizationServer.Channel.PrepareResponse(approval).AsActionResult();
}
获得授权代码后,您可以使用 WebServerClient
实例并调用其 RequestUserAuthorization
方法来调用 token 端点。
当此回调返回时,您可以调用 ProcessUserAuthorization
方法,该方法将返回一个带有您的访问 token 和刷新 token 的 IAuthorizationState
对象。
关于asp.net-mvc - 带自己的身份验证服务器的 DotNetOpenAuth OpenID 流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16855131/