3

我很难找到我必须使用的场景DotNetOpenAuth和我必须处理的特定流程的答案。

在下图中,我同时控制 MVC 站点和 API。API 既是我的授权服务器,也是我的资源服务器。

用户名和密码流程

在用户在我的系统上创建本地帐户的情况下,该过程相当明显,因为我正在处理用户名和密码凭据以将它们登录到站点,然后我可以将其传递到我的令牌端点并随后传递到HandleTokenRequest我的授权服务器,以便为我的客户端获取访问令牌和刷新令牌,然后开始访问资源。

OpenID 流程

我目前不知所措的流程是,如果用户决定使用他们的 Google 凭据登录我的网站(例如)。在这种情况下,我如何在我的 API 中从我自己的授权服务器授予他们访问令牌和刷新令牌?

我将在对我的 API 令牌端点的请求中包含什么?

我编写了自己的 API 客户端,它继承自作为库WebServerClient一部分的类。DotNetOpenAuth

我已经看到提供了一个用于处理令牌的接口,IServiceProviderTokenManager但它似乎在 OpenID 提供程序场景中使用,而不是在像我这样的 API 客户端实现中使用,所以我假设我需要编写一个自定义类来存储和检索我的在客户端拥有自己的 API 令牌,但也希望得到确认?

值得一提的是,网站和 API 都可以完全访问同一个安全数据库,但只有 API 可以访问保存任何资源的数据库。使用带有用户名和密码的本地帐户或 openid 提供程序显示一组流

4

1 回答 1

1

为了完整起见,我想我会用我的答案更新这个问题。

我最终做的是将AuthorizeToken端点移动到我的 MVC 4 应用程序中,而不是将它们放在 API 本身中。

这样,当使用登录用户(因此存在 ASP.NET FormsAuthentication cookie)调用 Authorize 端点时,可以在请求处理遇到此代码时获得授权代码:

        // 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带有您的访问令牌和刷新令牌的对象。

于 2013-06-06T16:23:29.337 回答