WebService发布之后,任何用户都可以对其进行调用,为了防止一些接口被匿名用户访问,可以对.net webservice实现调用认证,把要认证的信息填入SoapHeader中,在调用Api时一并发给服务端,服务端取出认证信息进行验证,如果通过,则继续执行,如果不通过,则返回错误信息,这样就达到了验证调用者身份的效果,下面来说说具体做法:
假设现在我们有一个WebService,里面有一个HelloWorld方法,
[WebService(Namespace = "http://tempuri.org")] [WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)] [System.ComponentModel.ToolboxItem(false)] public class HwWebService : System.Web.Services.WebService { [WebMethod] public string HelloWorld() { return "Hello World"; } }
首先自定义一个消息类,用于存放验证信息,继承自SoapHeader。
public class AuthorizeHeader : SoapHeader { public string User { get; set; } public string Password { get; set; } }
接着我们在WebService代码里加入一个AuthorizeHeader实例,用于接收客户端传递过来的认证信息。注意一定要是public的,不然外部访问不到会报错。
public AuthorizeHeader authHeader = null;
然后在刚才的HelloWorld方法上加入一个新的Atrribute
[SoapHeader("authHeader")]
我们看一下SoapHeader构造方法的说明,有这么一段:
// Summary: // Initializes a new instance of the System.Web.Services.Protocols.SoapHeaderAttribute // class, setting the member of the XML Web service class representing the SOAP // header contents. // // Parameters: // memberName: // The member of the XML Web service class representing the SOAP header contents. // The System.Web.Services.Protocols.SoapHeaderAttribute.MemberName property // will be set to the value of this parameter. public SoapHeaderAttribute(string memberName);
可以看到叫memberName的属性将会被赋值为SOAP header的内容,这样我们上面[SoapHeader(“authHeader”)]里的authHeader就可以拿到SoapHeader的值了。
[amazon_link asins=’B01LW72R2M,B00P8VZ8T4,B015316YQE’ template=’CopyOf-ProductGrid’ store=’boyd-23′ marketplace=’CN’ link_id=”]
拿到验证内容,现在我们来加一个验证方法:
private bool ValidateUser(string user, string pw) { if(user == "Hello" && pw == "World") return true; return false; }
改造一下HelloWorld方法:
[WebMethod] [SoapHeader("authHeader")] public string HelloWorld() { if(authHeader == null || !ValidateUser(authHeader.User, authHeader.Password)) return "You Don't have permission to access this API."; return "Hello World!"; }
接下来用客户端测试一下:
static void Main(string[] args) { HwWebservice hw = new HwWebservice(); Console.WriteLine(hw.HelloWorld()); hw.AuthorizeHeaderValue = new AuthorizeHeader(); hw.AuthorizeHeaderValue.User = "Hello"; Console.WriteLine(hw.HelloWorld()); hw.AuthorizeHeaderValue.Password = "World"; Console.WriteLine(hw.HelloWorld()); }
完整代码地址:
http://pan.baidu.com/s/1eQ9Ujrs