2012-11-29 171 views
0

我有DNOA的实施,我遇到了麻烦。我看到的示例代码是错误的,无法正常工作,我无法弄清楚如何正确工作。DotNetOpenAuth - 客户端标识符和授权

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

使用ExchangeUserCredentialForToken时DNOA正在向授权服务器发送用户名密码凭证。在这个覆盖范围内,它使用了一个NetworkCredential类,它似乎可以清除client_id和client_secret属性(这些属性显然已移入基本验证HTTP标头,然后由HttpWebRequest擦除)。代码检查在系统中为用户和此客户端验证了有效的授权

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

我只能假设要么我的理解是不正确的ct,我见过的样品不正确或DNOA存在问题。

我已经试过手动反序列化使用的access_token:

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

然而,在访问令牌的clientidentifier也是空。

从阅读DNOA组的线程看来,客户端标识符应该也可以在CreateAccessToken方法中使用,但它永远不会 - 它总是空的。

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

任何人都可以建议我的假设是完全错误的使用客户端标识符或解决方案获取客户端标识符到授权服务器的请求。

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

是否有人知道如何让NetworkCredential类在请求中传递client_id而不使其失效?

回答

2

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

默认NetworkCredentialApplicatoris fixed在DotNetOpenAuth 4.1.5(尚未发布截至2012年12月2日)

0

我通过创建自己的ClientCredentialApplicator实现解决了这个问题,然后在构建客户端时使用它。

类是相当简单:实例客户WebServerClient时

 var clientCred = new ClientIdentifierApplicator(ApiKey, ApiSecret); 

然后或UserAgentClient你可以为它供给:

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 OAuthWebServerClient = new WebServerClient(AuthServerDescription, ApiKey, clientCred); 

我试过使用内部的NetworkCredentialApplicator,但无法让其按需要工作。