DotNetOpenAuth OpenID流与自己的Auth服务器
我在使用DotNetOpenAuth
和必须处理的特定流程中需要实现一个场景的答案时遇到了很多困难。
在下面的图形中,我控制着MVC站点和API。 该API既是我的授权服务器,也是我的资源服务器。
用户名和密码流
在用户在我的系统上创建本地帐户的情况下,该过程非常明显,因为我正在处理用户名和密码凭证以将它们登录到站点,然后我可以将它们传递到我的令牌端点,然后经过传递给我的授权服务器的HandleTokenRequest
,以获取令牌并为我的客户端刷新令牌,然后开始访问资源。
OpenID流
我目前迷失的流量是,如果用户决定使用他们的Google凭证登录我的网站(例如)。 在这种情况下,我如何授予他们访问令牌的权限,并在我的API中从我自己的授权服务器刷新令牌?
我将包含在对我的API令牌端点的请求中?
我编写了自己的API客户端,该客户端从作为DotNetOpenAuth
库一部分的WebServerClient
类继承而来。
我已经看到有一个处理令牌的接口叫做IServiceProviderTokenManager
但似乎在OpenID提供者场景中使用,而不是像我的API客户端实现,所以我假设我需要编写一个自定义类来存储和检索我在客户端自己的API令牌,但是也希望得到证实?
值得一提的是,网站和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
方法。
当这个回调时,你可以调用ProcessUserAuthorization
方法,该方法将返回一个带有你的访问令牌和刷新令牌的IAuthorizationState
对象。