我有一个DNOA的实现,我遇到了麻烦。我看到的样本中的代码是错误的,无法正常工作,我无法弄清楚如何正常工作。
我在DNOA组here上提出了类似的问题,但我想知道这是否实际上是一个与OAuth相关的更大问题。安德鲁声称这应该有效,但我看到很多人都在问同样的问题而没有真正的解决方案。
使用ExchangeUserCredentialForToken时,DNOA正在向授权服务器发送用户名密码凭据。在幕后,它使用了一个NetworkCredential类,它似乎擦除了client_id和client_secret属性(这些属性显然已移入基本身份验证HTTP标头,然后由HttpWebRequest擦除。
在DNOA示例中,我看到代码检查系统中是否为用户和此客户端保留了有效授权。
如果没有客户端标识符,则无法检查有效授权,因为我们无法检查所请求的范围是否属于用户可能或可能未授权客户端访问的范围。
我只能假设我的理解不正确,我看到的样本不正确或DNOA存在问题。
我尝试使用以下方法手动反序列化access_token:
var token = accessTokenAnalyser.DeserializeAccessToken(new Dummy(), authHeader.Replace("Bearer ", ""));
但是,访问令牌中的clientidentifier也为空。
从DNOA组读取线程看来,客户端标识符也应该在CreateAccessToken方法中可用但它永远不会 - 它始终为空。
示例中的另一个场景显示authroisation服务器在TryAuthorizeResourceOwnerCredentialGrant中自动添加授权,但由于clientidentifier始终为null,因此这是不可能的。
任何人都可以建议我使用客户端标识符或解决方案完全错误地将客户端标识符放入授权服务器的请求中。
此外,如果在此授权过程中我们无法了解客户端,我们也无法强制执行任何客户端范围检查。
有没有人知道如何让NetworkCredential类在请求中传递client_id而不将其归零?
答案 0 :(得分:2)
使用DotNetOpenAuth附带的PostParameterApplicator
也应解决此问题。
DotNetOpenAuth 4.1.5中的默认NetworkCredentialApplicator
is fixed(自12/12/2012起尚未发布)
答案 1 :(得分: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但无法按需运行。