无法使用 SoapHeader 对 .NET 4.0 中的 Web 服务进行身份验证
Unable to use SoapHeader to authenticate Web Service in .NET 4.0
我的 Web 服务有以下控制器 class。我正在尝试使用 SoapHeader 向其添加身份验证。该系统正在使用.NET 4.0。我的代码如下所示:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.IO;
using System.Web.Services.Protocols;
public class AuthHeader : System.Web.Services.Protocols.SoapHeader
{
public string username { get; set; }
public string password { get; set; }
public bool IsValid()
{
return this.username == "admin" && this.password == "admin";
}
}
[WebService(Namespace = "http://tempuri.org")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
[ScriptService]
public class FormController: System.Web.Services.WebService
{
public AuthHeader auth;
[WebMethod]
[SoapHeader ("auth")]
public string GetFormTypes()
{
if (auth != null)
{
if (auth.IsValid()) {
var obj = SQLQueries.ParseQuery(false, "select * from form");
Debug.WriteLine(obj);
obj.WriteToResponse();
return "Successfully authenticated";
}
else {
var res = "Invalid credentials";
return res;
}
}
else
{
var res = "Error in authentication";
return res;
}
}
}
我正在使用 postman 工具对其进行测试。我的有效载荷主体看起来像:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://tempuri.org">
<username>admin</username>
<password>admin</password>
</AuthHeader>
</soap:Header>
<soap:Body>
<GetFormTypes xmlns="http://tempuri.org" />
</soap:Body>
</soap:Envelope>
我在网上查的所有例子,包括微软的官方文档都是用类似的方式做的,但我的代码不起作用。当我发送请求时,soap header auth
的值始终为空。
我做错了什么?
注意:我在应用程序的流程中使用了您的代码,没有任何变化。 运行 本地机器中的代码。点击 web 方法,复制 url 并粘贴到 postman.
我尝试根据您的代码创建服务,它在邮递员中运行良好,下面是屏幕截图和代码
尝试将下面的 xml 请求传递给 body,如邮递员中的图表所示。
此外,请确保在 Postman 的 Header 部分中将 Content-Type 设置为 text/XML。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://tempuri.org/">
<username>admin</username>
<password>admin</password>
</AuthHeader>
</soap:Header>
<soap:Body>
<GetFormTypes xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>
我的 Web 服务有以下控制器 class。我正在尝试使用 SoapHeader 向其添加身份验证。该系统正在使用.NET 4.0。我的代码如下所示:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Web;
using System.Web.Script.Services;
using System.Web.Services;
using System.IO;
using System.Web.Services.Protocols;
public class AuthHeader : System.Web.Services.Protocols.SoapHeader
{
public string username { get; set; }
public string password { get; set; }
public bool IsValid()
{
return this.username == "admin" && this.password == "admin";
}
}
[WebService(Namespace = "http://tempuri.org")]
[WebServiceBinding(ConformsTo = WsiProfiles.None)]
[ScriptService]
public class FormController: System.Web.Services.WebService
{
public AuthHeader auth;
[WebMethod]
[SoapHeader ("auth")]
public string GetFormTypes()
{
if (auth != null)
{
if (auth.IsValid()) {
var obj = SQLQueries.ParseQuery(false, "select * from form");
Debug.WriteLine(obj);
obj.WriteToResponse();
return "Successfully authenticated";
}
else {
var res = "Invalid credentials";
return res;
}
}
else
{
var res = "Error in authentication";
return res;
}
}
}
我正在使用 postman 工具对其进行测试。我的有效载荷主体看起来像:
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://tempuri.org">
<username>admin</username>
<password>admin</password>
</AuthHeader>
</soap:Header>
<soap:Body>
<GetFormTypes xmlns="http://tempuri.org" />
</soap:Body>
</soap:Envelope>
我在网上查的所有例子,包括微软的官方文档都是用类似的方式做的,但我的代码不起作用。当我发送请求时,soap header auth
的值始终为空。
我做错了什么?
注意:我在应用程序的流程中使用了您的代码,没有任何变化。 运行 本地机器中的代码。点击 web 方法,复制 url 并粘贴到 postman.
我尝试根据您的代码创建服务,它在邮递员中运行良好,下面是屏幕截图和代码
尝试将下面的 xml 请求传递给 body,如邮递员中的图表所示。 此外,请确保在 Postman 的 Header 部分中将 Content-Type 设置为 text/XML。
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<AuthHeader xmlns="http://tempuri.org/">
<username>admin</username>
<password>admin</password>
</AuthHeader>
</soap:Header>
<soap:Body>
<GetFormTypes xmlns="http://tempuri.org/" />
</soap:Body>
</soap:Envelope>