【问题标题】:SOAP Basic Authorization using C#使用 C# 的 SOAP 基本授权
【发布时间】:2015-09-11 10:14:55
【问题描述】:

我们使用了一个在 SAP 中创建的 Web 服务。我们能够像使用一样成功连接到服务

var rowss = new EpiCompaniesImplServiceService();  //Service object creation
rowss.Credentials = new NetworkCredential("username", "password"); 

客户端建议我们不要以纯文本形式发送凭据,而是使用用户名和密码以 base64 编码的字符串形式发送凭据。为此,我们尝试通过将凭据转换为 base64 编码方式来添加授权标头,如下所示,

WebRequest myReq = WebRequest.Create(rowss.Url);
string usernamePassword = "username" + ":" + "password";
CredentialCache mycache = new CredentialCache();
myReq.Credentials = mycache;
myReq.Headers.Add("Authorization", "Basic " + usernamePassword);

但它抛出了 401 未经授权的错误。 现在客户要求我们尝试使用 SOAP 标头传递。请通过 N/W 凭据传递编码凭据或通过 SOAP 标头传递它来建议我一些方法。

【问题讨论】:

  • 我认为你需要添加这一行mycache.Add(new Uri(rowss.Url), "Basic", basic);
  • 它不是那样工作的。在它自己之前也尝试过
  • 您是否尝试过将预认证设置为真:rowss.PreAuthenticate = true;

标签: c# asp.net web-services soap authorization


【解决方案1】:

似乎您只是缺少 base64 中的编码:

 WebRequest myReq = WebRequest.Create(rowss.Url);
 string usernamePassword = "username" + ":" + "password";
 usernamePassword = Convert.ToBase64String(new ASCIIEncoding().GetBytes(usernamePassword)); // <--- here.
 CredentialCache mycache = new CredentialCache();
 myReq.Credentials = mycache;
 myReq.Headers.Add("Authorization", "Basic " + usernamePassword);

【讨论】:

  • Timur,感谢您的回复,但我们已经尝试了上面的代码,我在我的问题中提到了按照您所说的方式使用 base 64 编码并且也以正常方式进行了编码,但是两者都不起作用。我想有必要传递给 SOAP Header 或通过网络凭据。有人猜到怎么做吗?
  • 我是对的,它在没有 base64 的情况下工作,然后当你用 base64 编码时它停止工作了吗?