1. Présentation :
Les services Web sont des services d'application en ligne publiés par les entreprises pour répondre à leurs besoins commerciaux spécifiques. D'autres sociétés ou logiciels d'application peuvent accéder et utiliser ce service en ligne via Internet. Il fournit logiquement des données et des services à d'autres applications. Chaque application accède au service Web via des protocoles réseau et certains formats de données standard spécifiés (Http, XML, Soap) et obtient les résultats requis grâce à l'exécution interne du service Web. Puisqu'il est appelé via Internet, il doit y avoir des problèmes de sécurité qui peuvent être appelés par les utilisateurs du réseau. Comment implémenter la restriction des autorisations d'accès aux services Web est un problème important rencontré par les utilisateurs de services Web. Vous trouverez ci-dessous deux solutions pour résoudre les problèmes ci-dessus, du plus superficiel au plus profond.
2. Méthode simple basée sur la fonctionnalité "soapheader"
1. Présentation de "soapheader"
L'en-tête SOAP fournit une méthode pour transmettre des données aux méthodes de services Web XML ou transmettre des données. à partir des méthodes de services Web XML, à condition que les données ne soient pas directement liées à la fonctionnalité principale de la méthode de services Web XML. Dans la plupart des cas, il est utilisé pour transférer des informations d’authentification des utilisateurs. Bien entendu, son rôle est bien plus que cela, et il reste à le découvrir dans des applications pratiques.
2. soapheader implémente le code d'authentification de l'utilisateur
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; namespace UserCenter { public class MySoapHeader :SoapHeader { public string UserName { get; set; } public string PWD { get; set; } } /// <summary> /// MyMath 的摘要说明 /// </summary> [WebService(Namespace = "http://tempuri.org/")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class MyMath : System.Web.Services.WebService { public MySoapHeader sHeader; [WebMethod] public string HelloWorld() { return "Hello World"; } [WebMethod] [SoapHeader("sHeader")] public string add(int x, int y) { if (sHeader.UserName == "test" && sHeader.PWD == "test") { return (x + y).ToString(); } else { return null; } } } }
3 Analyse des inconvénients :
(1) La logique de service et la logique de vérification des autorisations de l'utilisateur sont mélangées, et Complexité de compréhension des grands programmes.
(2) La logique d'autorisation n'est pas hautement réutilisable
2 Méthode basée sur la fonctionnalité "SoapExtensionAttribute"
1. Présentation de SoapExtensionAttribute et SoapExtension
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Services; using System.Web.Services.Protocols; namespace XMLClass1.class15.content { [AttributeUsage(AttributeTargets.Method)] public class MyExtensionAttribute : SoapExtensionAttribute { int _priority = 1; public override int Priority { get { return _priority; } set { _priority = value; } } public override Type ExtensionType { get { return typeof(MyExtension); } } } public class MyExtension : SoapExtension { //这个override的方法会被调用四次 //分别是SoapMessageStage BeforeSerialize,AfterSerialize,BeforeDeserialize,AfterDeserialize public override void ProcessMessage(SoapMessage message) { if (message.Stage == SoapMessageStage.AfterDeserialize)//反序列化之后处理 { bool check = false; foreach (SoapHeader header in message.Headers) { if (header is MySoapHeader) { MySoapHeader myHeader = (MySoapHeader)header; if (myHeader.Name == "admin" || myHeader.PassWord == "admin") { check = true; break; } } } if (!check) throw new SoapHeaderException("认证失败", SoapException.ClientFaultCode); } } public override Object GetInitializer(Type type) { return GetType(); } public override Object GetInitializer(LogicalMethodInfo info, SoapExtensionAttribute attribute) { return null; } public override void Initialize(Object initializer) { } } public class MySoapHeader : SoapHeader { string _name; string _passWord; public string Name { get { return _name; } set { _name = value; } } public string PassWord { get { return _passWord; } set { _passWord = value; } } } /// <summary> /// headersoap2 的摘要说明 /// </summary> [WebService(Namespace = http://tempuri.org/)] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] // 若要允许使用 ASP.NET AJAX 从脚本中调用此 Web 服务,请取消对下行的注释。 // [System.Web.Script.Services.ScriptService] public class headersoap2 : System.Web.Services.WebService { public MySoapHeader header; [WebMethod] [MyExtensionAttribute] [SoapHeader("header", Direction = SoapHeaderDirection.In)] public string CheckHeader() { //业务逻辑. return "Something done"; } } }