无法使用 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>