0

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

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

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

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

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

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

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

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

但是,访问令牌中的 clientidentifier 也是 null。

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

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

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

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

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

4

2 回答 2

2

使用PostParameterApplicatorDotNetOpenAuth 附带的也应该可以解决这个问题。

默认值在 DotNetOpenAuth 4.1.5 中NetworkCredentialApplicator 已修复(截至 2012 年 12 月 2 日尚未发布)

于 2012-12-03T03:55:15.910 回答
0

我通过创建自己的 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,但无法按预期工作。

于 2012-11-30T17:29:17.670 回答