DotNetOpenAuth - 客户端如何使用id和secret进行身份验证?

时间:2014-01-12 16:06:47

标签: c# oauth-2.0 dotnetopenauth

我正在使用DotNetOpenAuth 4.3.4完成OAuth2的授权和资源服务器。为了测试,我通过实现OAuth2Client创建了测试客户端。

因为我正在使用DNOA进行所有通信和请求解析,所以我不确定我是否完全理解了幕后发生的事情。但是当我制作文档时,这些知识非常重要。

那么,您能否向我解释一下客户认证在DNOA中的作用?我使用授权代码作为grant_type,当我使用我的测试客户端交换access_token的代码时,DNOA以某种方式验证client_secret和client_id。我下载了DNOA的源代码,但没有帮助。

当我将断点设置为Oauth2控制器(令牌方法)并将请求解析为HttpRequestMessage时,我看到请求包含“grant_type”,“code”和“redirect_uri”。但是client_id和client_secret在哪里?

另外,您能告诉我在哪里可以找到DNOA的任何可用文档吗?我需要创建文档,这些文档对所有平台都有效且可用,而不仅仅是可以使用DNOA的C#。

相关问题: 我读到的地方,我们不应该为未经验证的客户端创建授权码,但这正是DNOA所做的(因为即使秘密是错误的,我也会收到授权码)。可以吗?

修改

这是我正在尝试阅读的请求。这是DNOA客户端提出的令牌请求。我无法在“code”,“redirect_uri”和“grant_type”等其他参数下看到client_id和client_secret。我认为他们必须在一起。也许我错过了http请求和响应中的重要内容。

当我让DNOA继续HandleTokenRequest(请求)时,它会成功验证客户端应用程序(在DNOA客户端应用程序配置中设置了错误密码时失败)。

enter image description here

修改2

private readonly WebServerClient Client;    
protected override string QueryAccessToken(Uri returnUrl, string authorizationCode)
            {
                var authorization = Client.ProcessUserAuthorization();
                if (authorization != null)
                    return authorization.AccessToken;
                else
                    return null;
            }

这是我对QueryAccessToken的实现。它来自一些样本。我想我在开始时创建了这个并没有改变它,因为它有效。

去找DNOA来源我发现它是来自OAuth 1的方法。这可能是问题所在。但问题是,为什么它适用于正确的客户端问题而不能处理坏的问题。

最终修改

看起来DNOA客户端使用http基本授权(client_id和secret在标头中)。但我需要DNOA服务器才能从POST中获取这些参数。

如果有人知道如何设置DNOA以支持POST参数中的client_id和client_secret,那就太棒了!

谢谢

1 个答案:

答案 0 :(得分:3)

授权代码授权需要两个步骤。

第一步是浏览器重定向到身份提供者并显示登录ui。授权代码由身份提供者返回浏览器,然后从浏览器返回到客户端应用程序。这一步不涉及客户秘密!这是因为最终用户可以调试流程的这一部分,她不应该学习客户端密钥的值。

然后,当客户端应用程序具有一次性授权代码时,它直接与令牌端点(服务器到服务器)进行协商,以交换授权令牌的授权代码。这是客户端ID和客户端密钥用于验证只有合法的客户端应用程序交换令牌代码的地方。

此流程背后的想法是保护最终用户不将其密码暴露给客户端应用程序,并保护客户端应用程序不将其客户端密钥暴露给最终用户。

另请注意,授权代码授权流程最复杂,因为它涉及用户名/密码(由最终用户提供)和clientid / client secret(由客户端应用程序提供)。还有其他流程允许以稍微不同的方式获取授权令牌,即:

  • 资源所有者授权,包括最终用户直接向身份提供者的令牌端点发送用户名/密码。此流程适用于可以自定义登录ui的桌面/移动/本机应用程序(但它也可能引起怀疑,用户可能会合理地拒绝使用它)

  • 客户端凭据流,包括客​​户端应用程序向idntity提供程序发送clientid / client secret。没有最终用户,只有客户端应用程序在身份提供商中进行身份验证。

更多关于流程的信息:

http://aaronparecki.com/articles/2012/07/29/1/oauth2-simplified

对于DNOA,我发现它很干净,可以理解,但文档缺乏。幸运的是,示例很棒,虽然几乎没有记录,但几乎可以找到所有内容。尽管如此,我能够在三天内建立oauth2身份提供者和资源服务器,并支持所有四个oauth2流。我不会深入研究细节,因为这不是您的问题所在,但是,如果您有DNOA特定问题,请问。

修改:关于QueryAccessToken实施,您似乎在内部使用WebServerClient。在我的代码中,我只是初始化它的属性:

WebServerClient client = ...

client.ClientIdentifier = "client_id";
client.ClientCredentialApplicator = 
     ClientCredentialApplicator.PostParameter( "client_secret" );

配置了这两个,client_idclient_secret都会被发送到令牌服务,并在POST参数中传递client_secret