无法使网络凭据起作用

14

我已经使用DotNetOpenAuth一段时间了,今天我需要添加对强制我使用基本认证发送密钥的提供程序的支持(我一直在使用旧版本和仅Post参数)。

我尝试使用ClientCredentialApplicator.NetworkCredential,但它不起作用。然后根据这里的建议,我自己创建了ClientCredentialApplicator

仍然不起作用,我在ApplyClientCredential中设置断点,但它们从未触发。

我升级到最新版本(4.3.0.0),应该有这个修复

一切工作正常,但没有Authorization头,并且远程服务器回答301错误(这使我认为它是与修订版相同的问题-在服务器回答Unauthorized之前没有向请求添加授权信息,而我正在使用的提供程序在没有Authorization头时回答301)。


1
你有收到任何错误吗?你的应用程序中是否有打印返回代码的日志记录? - Mare Infinitus
1
您能告诉我们服务提供商是谁吗?这可能有助于测试可能的解决方案。 - Andy Brown
我不熟悉DotNetOpenAuth,但我在httpRequest中遇到了类似的错误,并通过添加一个名为“PreAuthenticate”的头解决了它。请尝试查看是否有这样的头。 - Pedro.The.Kid
@Pedro.The.Kid - 我想我知道你的意思了 - 在第一次请求时进行身份验证,而不必等待“未经授权”的响应。DotNetOpenAuth 最近有一个补丁 应该 可以处理这个问题。不幸的是,它并没有起作用,我在他们的 GitHub 上开了一个问题,但没有回应 :( 是的,这很可能是问题所在,因为提供者没有用“未经授权”的头部回答,而是用 301 和错误信息回答。 - Madd0g
我遇到了同样的问题。据我所记,如果您正在使用HttpWebRequest C#机制,则只有在从服务器接收到401响应后才会发送凭据。您可以自己添加身份验证标头。对我有用。链接是摘要认证,因此基本应该更容易。链接https://dev59.com/-U7Sa4cB1Zd3GeqP5KSk。 - Omri Btian
显示剩余8条评论
3个回答

1
我有类似的需求:需要一个OAuth2提供程序,需要HTTP基本身份验证。这个解决方案对我很有效。
var authServer = new AuthorizationServerDescription { AuthorizationEndpoint = new Uri(AuthorizeUrl), TokenEndpoint = new Uri(AccessTokenUrl) };
var authClient = new WebServerClient(authServer, ConsumerKey, ConsumerSecret)
{
    ClientCredentialApplicator = ClientCredentialApplicator.NetworkCredential(ConsumerSecret)
};

使用DotNetOpenAuth.OAuth2.ClientCredentialApplicator.NetworkCredentialApplicator构造函数时存在问题,该构造函数需要一个System.Net.NetworkCredential实例。在ApplyClientCredential方法中,使用的是凭据中ClientSecret属性而不是Password属性(请参见下文)。请注意保留HTML标签。
public override void ApplyClientCredential(string clientIdentifier, HttpWebRequest request)
{
  if (clientIdentifier == null)
    return;
  if (this.credential != null)
    ErrorUtilities.VerifyHost((string.Equals(this.credential.UserName, clientIdentifier, StringComparison.Ordinal) ? 1 : 0) != 0, "Client identifiers \"{0}\" and \"{1}\" do not match.", (object) this.credential.UserName, (object) clientIdentifier);
  OAuthUtilities.ApplyHttpBasicAuth(request.Headers, clientIdentifier, this.clientSecret);
}

我知道这个问题很久远了,希望这能帮助其他正在寻找解决方案的人。


1

这里是代码。它可以与WebClients和FtpWebRequests等一起使用,对我有效。

using System.Net;

NetworkCredential credentials = new NetworkCredential("user","pass");
request.Credentials = credentials;

希望它有所帮助 :)

-1

您可以通过访问请求的 Headers 集合,手动向 HttpWebRequest 添加基本身份验证标头。

您可以按照 Wikipedia 上的指示添加标头:

request.Headers.Add("Authorization", "Basic " + Convert.ToBase64String(new UTF8Encoding(false).GetBytes("username:password")));

什么是 HttpWebRequest? - Dor
https://learn.microsoft.com/en-us/dotnet/api/system.net.httpwebrequest?view=netcore-3.1 - CMerat

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接