HTTP RFC2617 里规定的两种标准的认证方式(Baisc,Digest)与常见的SESSION机制不同。HTTP认证是无状态的,在HTTP-HEADER里传输。而 SESSION则在服务端要维护,通过客户端发送SESSIONID来标识不同的用户。
如果是SOAP Web service需要HTTP的基本认证:
用Visual Studio或者SDK生成一个Web Service的调用类,假设该类是HelloWorldService 。然后写一新类NewHelloWorldService 继承自工具生成的类HelloWorldService:
public class NewHelloWorldService : HelloWorldService {
protected override WebRequest GetWebRequest(Uri uri) {
WebRequest r = base.GetWebRequest(uri);
// http basic authentication
r.Credentials = new NetworkCredential("%UserName%", "%UserPassword%");
// if you want to get latest data without cache
// r.Headers["Cache-Control"] = "no-cache";
// Set 180 seconds timeout
// r.Timeout = 180 * 1000;
return r;
}
}
其中最重要的一行就是加粗的部分,将用户名和密码分别替换%UserName%和%UserPassword%,即可实现HTTP基本认证。
如果服务器端的WEB服务又使用了Cookie验证,则在调用该服务的方法前,应该设置一个的CookieContainer:
CookieContainer theCookies = new CookieContainer();
HelloWorldService ws = new NewHelloWorldService();
ws.CookieContainer = theCookies;
如果要查看Response的一些HTTP头的信息,应该在NewHelloWorldService 类里重载GetWebResponse:
protected override WebResponse GetWebResponse(WebRequest request) {
WebResponse r = base.GetWebResponse(request);
foreach (string name in r.Headers.AllKeys) {
// if (name == aHEADER) {}
}
return r;
}
C#的NetworkCredential 将自动封装一个HTTP的HEADER:
Authorization: Basic aGVsbG86d29ybGQ=
上面的Authorization: Basic 后面的字符是Base64编码的用户名加上“:”再加上密码,即base64(UserName + ":" + UserPassword)。不同的用户有不同的值。
如果是Restful的Web服务:
HttpWebRequest和WebRequest则直接给Credentials 赋值一个NetworkCredential 即可。
如果用基于TCP的Socket:
则需要手工附加该HTTP的HEADER。