Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc DotNetOpenAuth OpenID流与自己的身份验证服务器_Asp.net Mvc_Oauth_Asp.net Web Api_Openid_Dotnetopenauth - Fatal编程技术网

Asp.net mvc DotNetOpenAuth OpenID流与自己的身份验证服务器

Asp.net mvc DotNetOpenAuth OpenID流与自己的身份验证服务器,asp.net-mvc,oauth,asp.net-web-api,openid,dotnetopenauth,Asp.net Mvc,Oauth,Asp.net Web Api,Openid,Dotnetopenauth,对于我必须使用DotNetOpenAuth实现的场景和我必须处理的特定流,我很难找到答案 在下图中,我控制着MVC站点和API。API既是我的授权服务器,也是我的资源服务器 用户名和密码流 当我处理用户名和密码凭据时,用户在我的系统上创建了一个本地帐户,将其登录到站点,然后我可以将其传递到我的令牌端点,然后再传递到我的授权服务器的HandleTokenRequest,以获取访问令牌和刷新客户端的令牌,然后开始访问资源 OpenID流 我目前感到困惑的是,如果用户决定使用他们的Google凭据登录

对于我必须使用
DotNetOpenAuth
实现的场景和我必须处理的特定流,我很难找到答案

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

用户名和密码流

当我处理用户名和密码凭据时,用户在我的系统上创建了一个本地帐户,将其登录到站点,然后我可以将其传递到我的令牌端点,然后再传递到我的授权服务器的
HandleTokenRequest
,以获取访问令牌和刷新客户端的令牌,然后开始访问资源

OpenID流

我目前感到困惑的是,如果用户决定使用他们的Google凭据登录我的网站(例如)。在这个场景中,我如何在API中授予他们从我自己的授权服务器访问令牌和刷新令牌

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

我已经编写了自己的API客户端,它继承了
WebServerClient
类,该类是
DotNetOpenAuth
库的一部分

我已经看到,提供了一个名为
IServiceProviderTokenManager
的接口来处理令牌,但该接口似乎用于OpenID提供程序场景,而不是像我这样的API客户端实现,因此我假设我需要编写一个自定义类来在客户端存储和检索我自己的API令牌,但是你想确认一下吗


值得一提的是,网站和API都可以完全访问同一个安全数据库,但只有API可以访问存放任何资源的数据库。

为了完整性,我想我应该用我的答案更新这个问题

我最后做的是将
Authorize
Token
端点移动到我的MVC4应用程序中,而不是将它们放在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
方法,该方法将返回带有访问令牌和刷新令牌的
IAAuthorizationState
对象