我很难找到我必须使用DotNetOpenAuth
实现的方案的答案以及我必须处理的特定流程。
在下图中,我可以控制MVC站点和API。 API既是我的授权服务器又是我的资源服务器。
用户名和密码流
在用户在我的系统上创建本地帐户的过程中,这个过程非常明显,因为我正在处理用户名和密码凭据,以便将它们登录到站点,然后我可以将其传递到我的令牌端点传递到我的授权服务器的HandleTokenRequest
,以获取访问令牌并为我的客户端刷新令牌,然后开始访问资源。
OpenID流程
我目前处于亏损状态的流程是用户决定使用他们的Google凭据登录我的网站(例如)。在这种情况下,如何在我的API中授予他们访问令牌和刷新令牌的权限?
我在API令牌端点的请求中包含哪些内容?
我编写了自己的API客户端,该客户端继承自WebServerClient
库中的DotNetOpenAuth
类。
我已经看到提供了一个用于处理名为IServiceProviderTokenManager
的令牌的接口,但它似乎在OpenID提供程序场景中使用,而不是在我的API客户端实现中使用,所以我假设我需要编写一个自定义类,用于在客户端存储和检索我自己的API令牌,但是也希望确认这一点?
值得一提的是,网站和API都可以完全访问相同的安全数据库,但只有API可以访问保存任何资源的数据库。
答案 0 :(得分:1)
为了完整起见,我想我会用我的答案更新这个问题。
我最终做的是将Authorize
和Token
端点移动到我的MVC 4应用程序中,而不是将它们放在API本身中。
这种方式在使用登录用户调用Authorize端点(因此存在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
实例调用Token端点并调用其RequestUserAuthorization
方法。
当回调时,您可以调用ProcessUserAuthorization
方法,该方法将返回带有访问令牌和刷新令牌的IAuthorizationState
对象。