gpt4 book ai didi

c# - 无法对 ASP.NET Core 中的 SOAP 服务进行身份验证

转载 作者:太空宇宙 更新时间:2023-11-03 18:55:34 25 4
gpt4 key购买 nike

我正在尝试使用来自 ASP.NET Core 库项目的 SOAP Web 服务。

我已经安装了为我创建代理类的 Mictosoft WCF Web 服务引用提供程序,但我在身份验证方面遇到了问题。

我的代码目前看起来像这样:

var binding = new BasicHttpBinding(BasicHttpSecurityMode.TransportWithMessageCredential);

var address = new EndpointAddress(@"https://myserviceaddress.asmx");
var client = new TestApiClient(binding, address);
client.ClientCredentials.UserName.UserName = "testusername";
client.ClientCredentials.UserName.Password = "testpassword";
var result = await client.GetDataAsync(params);

我已经尝试了一些不同的方法,但我得到了未经授权的结果,或者得到了以下变体:绑定(bind)安全属性“securityMode”的上下文中不支持值“TransportWithMessageCredential”。

我想我还应该在 binding.Security.Message 上设置一些属性,但是 binding.Security 上存在的唯一属性是 Transport 模式

有人知道如何正确设置吗?

有没有其他更好的方法来使用 ASP.NET Core 中的 SOAP 服务?我喜欢一种不必创建代理类的动态方式,但如果必须的话,我可以使用代理,但我需要能够使用用户和密码进行身份验证,而且我必须使用 https。

最佳答案

在为同一个问题苦苦挣扎了很多天之后,因为 .Net 核心在这个答案发布之前的支持非常有限,我设法通过自己构建整个信封并使用 SimpleSoapClient 来解决它。 .

我将尝试通过一个简单的示例逐步完成所有需要的步骤。因为每个步骤都有自己需要解决的问题。

让我们假设您的模型是一只猫。

 public class Cat
{
public int Lives { get; set; }
}

您的整个包络模型将如下所示:

public class Envelope
{
public EnvelopeHeader Header { get; set; }
public EnvelopeBody Body { get; set; }
}
public class EnvelopeHeader
{
[XmlElementAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public Security Security { get; set; }
}


[XmlTypeAttribute(AnonymousType = true, Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
[XmlRootAttribute(Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd", IsNullable = false)]
public class Security
{
public SecurityUsernameToken UsernameToken { get; set; }
}


[XmlTypeAttribute(AnonymousType = true, Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public class SecurityUsernameToken
{
public string Username { get; set; }
public SecurityUsernameTokenPassword Password { get; set; }
[XmlAttributeAttribute(Form = System.Xml.Schema.XmlSchemaForm.Qualified, Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd")]
public string Id { get; set; }
}


[XmlTypeAttribute(AnonymousType = true, Namespace = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd")]
public class SecurityUsernameTokenPassword
{
[XmlAttributeAttribute()]
public string Type { get; set; }
[XmlTextAttribute()]
public string Value { get; set; }
}

public class EnvelopeBody
{
public Cat Cat{ get; set; }
}

P.S:不要忘记在您的正文中需要的地方包含 XML 命名空间。

下一步是将您的 Envelop 模型序列化为 XML 字符串。

string xml;
XmlWriterSettings settings = new XmlWriterSettings();
settings.OmitXmlDeclaration = true;
using (MemoryStream ms = new MemoryStream())
{
using (XmlWriter writer = XmlWriter.Create(ms, settings))
{
XmlSerializerNamespaces names = new XmlSerializerNamespaces();
names.Add("", "");//add your needed namespaces here
XmlSerializer cs = new XmlSerializer(typeof(Envelope));
var myEnv = new Envelope()
{
Header = new EnvelopeHeader()
{
Security = new Security()
{
UsernameToken = new SecurityUsernameToken()
{
Username = "",
Password = new SecurityUsernameTokenPassword()
{
Type = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText",//update type to match your case
Value = ""
}
}
}
},
Body = new EnvelopeBody()
{
Cat = new Cat() { Lives = 7 }
}
};
cs.Serialize(writer, myEnv, names);
ms.Flush();
ms.Seek(0, SeekOrigin.Begin);
StreamReader sr = new StreamReader(ms);
xml = sr.ReadToEnd();
}
}

最后使用以下方式发送您的 XML 信封:

  SoapEnvelope responseEnvelope = null;
using (var client = SoapClient.Prepare().WithHandler(new DelegatingSoapHandler()
{
OnHttpRequestAsyncAction = async (z, x, y) =>
{
x.Request.Content = new StringContent(xml , Encoding.UTF8, "text/xml");
}
}))
{
responseEnvelope = client.SendAsync("url", "action",SoapEnvelope.Prepare()).Result;
}

请注意,您需要根据您的情况更新许多选项。我的情况是 WCF 的 WSSE 安全 header 中类型为“PasswordText”的密码。

关于c# - 无法对 ASP.NET Core 中的 SOAP 服务进行身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46298153/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com