具有自己的Auth服务器的DotNetOpenAuth OpenID流程

时间:2013-05-31 10:26:01

标签: asp.net-mvc oauth asp.net-web-api openid dotnetopenauth

我很难找到我必须使用DotNetOpenAuth实现的方案的答案以及我必须处理的特定流程。

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

用户名和密码流

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

OpenID流程

我目前处于亏损状态的流程是用户决定使用他们的Google凭据登录我的网站(例如)。在这种情况下,如何在我的API中授予他们访问令牌和刷新令牌的权限?

我在API令牌端点的请求中包含哪些内容?

我编写了自己的API客户端,该客户端继承自WebServerClient库中的DotNetOpenAuth类。

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

值得一提的是,网站和API都可以完全访问相同的安全数据库,但只有API可以访问保存任何资源的数据库。Shows a set of flows using either local account with username and password or an openid provider

1 个答案:

答案 0 :(得分:1)

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

我最终做的是将AuthorizeToken端点移动到我的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对象。