【问题标题】:DotNetOpenAuth - ClientIdentifier & AuthorisingDotNetOpenAuth - 客户端标识符和授权
【发布时间】:2012-11-29 10:37:44
【问题描述】:

我有一个 DNOA 实现,但遇到了麻烦。我看到的示例中的代码是错误的,无法正常工作,我无法弄清楚如何让它正常工作。

我在 DNOA 组 here 上问过一个类似的问题,但我想知道这是否实际上是一个与 OAuth 相关的更大问题。 Andrew 断言这应该可行,但我看到很多人问同样的问题,但没有真正的解决方案。

当使用 ExchangeUserCredentialForToken 时,DNOA 正在向授权服务器发送用户名密码凭据。在幕后,这使用了一个 NetworkCredential 类,该类似乎擦除了 client_id 和 client_secret 属性(这些显然已移入基本身份验证 HTTP 标头,然后又被 HttpWebRequest 擦除。

在 DNOA 示例中,我看到代码检查系统中是否为用户和此客户端持有有效授权。

如果没有客户端标识符,则无法检查有效授权,因为我们无法检查请求的范围是否在用户可能授权或未授权客户端访问的范围内。

我只能假设要么我的理解不正确,要么我看到的样本不正确,要么 DNOA 有问题。

我尝试使用以下方法手动反序列化 access_token:

var token = accessTokenAnalyser.DeserializeAccessToken(new Dummy(), authHeader.Replace("Bearer ", ""));

但是,访问令牌中的客户端标识符也是空的。

从读取 DNOA 组的线程来看,客户端标识符似乎也应该在 CreateAccessToken 方法中可用,但它永远不会 - 它始终为空。

示例中的另一个场景显示授权服务器自动在 TryAuthorizeResourceOwnerCredentialGrant 中添加授权,但这也是不可能的,因为 clientidentifier 始终为空。

任何人都可以就我对使用客户端标识符的假设或将客户端标识符获取到授权服务器的请求中的解决方案提出建议。

此外,如果在此授权过程中我们无法知道客户端,我们也无法执行任何客户端范围检查。

有谁知道如何让 NetworkCredential 类在请求中传递 client_id 而不会使其为空?

【问题讨论】:

    标签: asp.net-mvc oauth dotnetopenauth


    【解决方案1】:

    使用 DotNetOpenAuth 附带的PostParameterApplicator 也应该可以解决此问题。

    DotNetOpenAuth 4.1.5 中的默认 NetworkCredentialApplicator is fixed(截至 2012 年 12 月 2 日尚未发布)

    【讨论】:

      【解决方案2】:

      我已通过创建自己的 ClientCredentialApplicator 实现并在构建客户端时使用它来解决此问题。

      这个类很简单:

      public class ClientIdentifierApplicator : DotNetOpenAuth.OAuth2.ClientCredentialApplicator
      {
          public string ApiKey { get; set; }
          public string ApiSecret { get; set; }
      
          public ClientIdentifierApplicator(string apiKey, string apiSecret)
          {
              ApiKey = apiKey;
              ApiSecret = ApiSecret;
          }
      
          public override void ApplyClientCredential(string clientIdentifier, System.Net.HttpWebRequest request)
          {
              base.ApplyClientCredential(clientIdentifier, request);
              request.Credentials = new NetworkCredential(ApiKey, ApiSecret);
          }
      }
      

      一旦你有了这个类,你可以像这样构造它:

              var clientCred = new ClientIdentifierApplicator(ApiKey, ApiSecret);
      

      然后在实例化您的客户端 WebServerClient 或 UserAgentClient 时,您可以将其作为构造函数参数提供:

              var OAuthWebServerClient = new WebServerClient(AuthServerDescription, ApiKey, clientCred);
      

      我尝试使用内部 NetworkCredentialApplicator,但无法按预期工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-08-31
        • 2019-04-06
        • 1970-01-01
        • 2012-02-15
        • 2020-07-14
        • 2019-07-01
        • 1970-01-01
        相关资源
        最近更新 更多