【问题标题】:DotNetOpenAuth - How does client authentificate with id and secret?DotNetOpenAuth - 客户端如何使用 id 和 secret 进行身份验证?
【发布时间】:2014-01-18 00:54:26
【问题描述】:

我刚刚使用 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(request) 时,它成功地验证了客户端应用程序(当在 DNOA 客户端应用程序配置中设置了错误的秘密时失败)。

编辑 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,那就太棒了!

谢谢

【问题讨论】:

  • DNOA 是一团糟。不要试图理解它在做什么。只需阅读互联网上的 OAuth2 规范摘要即可。
  • 我想说客户开发者“采用 OAuth2 规范并针对它进行开发”,但恐怕 DNOA 并没有实现所有内容,而且并非所有内容都相同。 .
  • DNOA 不复杂也不乱。您不必全部探索它,因为它不仅仅是 oauth2。我的回答中有更多内容。

标签: c# oauth-2.0 dotnetopenauth


【解决方案1】:

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

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

然后,当客户端应用程序具有一次性授权码时,它直接连接令牌端点(服务器到服务器)以将授权码交换为授权令牌。这是使用客户端 ID 和客户端密码来验证只有合法客户端应用程序交换代码以获取令牌的地方。

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

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

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

  • 客户端凭据流,涉及客户端应用程序向身份提供者发送客户端 ID/客户端机密。没有最终用户,只有客户端应用程序在身份提供者中进行身份验证。

更多关于流程的信息:

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 发送到令牌服务。

【讨论】:

  • 好的,非常感谢。现在我更清楚了 :-) 那么你能告诉我 client_id 和 client_secret 在哪里吗?因为当我在令牌端点上调试和读取 access_token 请求时,我无法找到 client_id 或 client_secret。正如我在问题中所说的那样,我想它们会出现在其他参数旁边。
  • @MartinPotvrzenejBrabec:clientid 和 clientsecret 都必须在那里,从客户端应用程序发布到令牌端点。 DNOA 会发布这些内容,尽管我相信 oauth2 规范并不要求这样做。这可能是您看不到这些参数的原因,因为您可能只查看查询字符串。如果不是这种情况,请提供您正在调试的特定方法的更多详细信息,我将咨询我的实现以验证您的担忧。
  • 我对这个问题添加了更多解释。谢谢。
  • @MartinPotvrzenejBrabec:我可以看到,虽然令牌请求包含code 参数(这表明此请求是用code 交换令牌),但它同时缺少client_idclient_secret。这很奇怪,我猜您的客户端应用程序方面出了点问题。您能否在客户端应用程序端从您的WebServerClient 配置中发布相关代码 sn-ps?具体怎么配置ClientCredentialApplicator
  • 客户端证书必须以某种方式进行验证,因为它在密码正确时起作用,并且在密码不正确时返回“invalid_client”。我正在为客户端应用程序使用默认的 MVC4 OAuth2 实现。我没有实现 ClientCredentialApplicator。我只创建了自己的TestClient,它继承自“DotNetOpenAuth.AspNet.Clients.OAuth2Client”并实现了一些抽象方法。然后我只需将此客户端添加到 global.aspx 中的 OAuthConfig -“OAuthWebSecurity.RegisterClient(new TestClient("TestingClient"));”。这就是我所做的一切。它有效,我不知道为什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-10
  • 1970-01-01
  • 2022-10-30
  • 2012-11-04
  • 2014-08-23
  • 1970-01-01
  • 2023-01-10
相关资源
最近更新 更多