LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

C# WebService 3 种身份验证方式总结和对比


2025年3月15日 9:16 本文热度 247

前言

嘿,大家好!

你使用过 WebService 吗?

WebService 就像是一座连接不同系统的小桥,通过 SOAP 或 REST 技术让数据在这座桥上自由穿梭。无论是分享天气预报,还是交换订单信息,WebService 都是实现这些数据交互的幕后英雄。

就像任何桥梁都需要护栏来保证行人安全一样,WebService 也需要一些保护措施来确保数据的安全传输。

而身份验证就是这座桥上的“护栏”,它能防止未经授权的访问,确保只有合法用户才能通过。

无论是简单的用户名密码验证,还是更复杂的 JWT 验证,C# 都提供了灵活的方式来实现。

接下来,我们就来看看如何在 C# 中实现它们。

准备好了吗?

1. SOAP 协议自定义验证

SOAP 协议允许在消息头部(Header)中添加自定义信息,所以我们可以利用这一点来实现身份验证。

实现步骤:

  1. 在客户端,将用户名和密码添加到 SOAP 头部

    var client = new MyWebService();
    client.Headers.Add("Username""admin");
    client.Headers.Add("Password""password");

    string result = client.SecureMethod();
    Console.WriteLine(result); // 输出:验证成功!敏感数据:12345
  2. 在服务端,解析 SOAP 头部并验证凭据

    [WebService(Namespace = "http://tempuri.org/")]
    publicclassMyWebService : WebService
    {
        [WebMethod]
        public string SecureMethod()
        {
            // 获取 SOAP 头部
            var headers = Context.Request.Headers;

            // 检查头部是否包含凭据
            if (headers["Username"] == "admin" && headers["Password"] == "password")
            {
                return"验证成功!敏感数据:12345";
            }
            else
            {
                thrownew SoapException("身份验证失败", SoapException.ClientFaultCode);
            }
        }
    }

优点:

  • 简单,容易实现
  • 适用于 SOAP 协议

缺点:

  • 安全性较低,凭据以明文传输,容易泄露
  • 需要手动处理头部信息

2. HTTP Basic 认证

HTTP Basic 认证是一种简单的身份验证方式,客户端将用户名和密码以 Base64 编码的形式发送到服务端。

实现步骤:

  1. 客户端将用户名和密码编码后添加到 HTTP 请求头

    var client = new HttpClient();
    var credentials = Convert.ToBase64String(Encoding.UTF8.GetBytes("admin:password"));
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Basic", credentials);

    var response = await client.GetAsync("http://localhost:50448/MyWebService.asmx/SecureMethod");
    var result = await response.Content.ReadAsStringAsync();
    Console.WriteLine(result); // 输出:验证成功!这是敏感数据ABCDE
  2. 服务端解码并验证凭据

    [WebService(Namespace = "http://tempuri.org/")]
    publicclassMyWebService : WebService
    {
        [WebMethod]
        public string SecureMethod()
        {
            var authHeader = Context.Request.Headers["Authorization"];

            if (authHeader != null && authHeader.StartsWith("Basic"))
            {
                var encodedCredentials = authHeader.Substring("Basic ".Length).Trim();
                var credentials = Encoding.UTF8.GetString(Convert.FromBase64String(encodedCredentials));
                var parts = credentials.Split(':');
                var username = parts[0];
                var password = parts[1];

                if (username == "admin" && password == "password")
                {
                    return"验证成功!这是敏感数据ABCDE";
                }
            }

            Context.Response.StatusCode = 401// 未授权
            Context.Response.AddHeader("WWW-Authenticate""Basic realm=\"MyWebService\"");
            return"身份验证失败";
        }
    }

优点:

  • 与第一种方法一样,实现起来也比较简单
  • 适用于 RESTful 服务。

缺点:

  • 安全性比第一种方法相比较好,但实际上 Base64 编码容易被解码,所以安全性也是比较低,最好使用 HTTPS 来保护传输安全

集成 JWT

C# WebService 没有内置 JWT 支持,但对于更复杂的场景,可以通过集成第三方包来使用 JWT 实现身份验证

实现步骤:

  1. 客户端通过登录接口获取 JWT 令牌。

    代码略,可参考以前文章《ASP.NET Core 标识(Identity)框架系列(二):使用标识(Identity)框架生成 JWT Token》的实现方法

  2. 客户端将 JWT 令牌添加到请求头

    var client = new HttpClient();
    client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer""your_jwt_token");

    var response = await client.GetAsync("http://yourserver/MyWebService.asmx/SecureMethod");
    var result = await response.Content.ReadAsStringAsync();
    Console.WriteLine(result); // 输出:验证成功!敏感数据:12345
  3. 服务端验证 JWT 令牌的有效性

    [WebService(Namespace = "http://tempuri.org/")]
    publicclassMyWebService : WebService
    {
        [WebMethod]
        public string SecureMethod()
        {
            var authHeader = Context.Request.Headers["Authorization"];

            if (authHeader != null && authHeader.StartsWith("Bearer"))
            {
                var token = authHeader.Substring("Bearer ".Length).Trim();
                var handler = new JwtSecurityTokenHandler();
                var validationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("your_secret_key")),
                    ValidateIssuer = false,
                    ValidateAudience = false
                };

                try
                {
                    var principal = handler.ValidateToken(token, validationParameters, out _);
                    return"验证成功!敏感数据:12345";
                }
                catch
                {
                    thrownew SoapException("身份验证失败", SoapException.ClientFaultCode);
                }
            }

            thrownew SoapException("未提供令牌", SoapException.ClientFaultCode);
        }
    }

优点:

  • 安全性高,适合分布式系统
  • 支持令牌过期和刷新

缺点:

  • 相比前2种方法,实现复杂度较高
  • 需要第三方库支持,如 System.IdentityModel.Tokens.Jwt

总结

本文我们一起探讨了 C# WebService 实现身份验证的3种方式:

  • 如果只是简单的验证,可以使用 SOAP 或 HTTP 基本认证
  • 如果需要更高的安全性,建议使用 JWT 或者其他方法

当然,无论哪种方式,建议最好都使用 HTTPS,保护传输的安全性。


该文章在 2025/3/17 9:13:36 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2025 ClickSun All Rights Reserved