用于Forms身份认证的密钥可以在web.config的machineKey配置节中指定,我们还可以指定加密解密算法:
- <machineKey
- decryption="Auto" [Auto | DES | 3DES | AES]
- decryptionKey="AutoGenerate,IsolateApps" [String]
- />
关于这二个属性,MSDN有如下解释:
这一小节送给所有对自动化测试感兴趣的朋友。
有时我们需要用代码访问某些页面,比如:希望用代码测试服务端的响应。
如果是简单的页面,或者页面允许所有客户端访问,这样不会有问题,但是,如果此时我们要访问的页面是一个受限页面,那么就必须也要像人工操作那样:先访问登录页面,提交登录数据,获取服务端生成的登录Cookie,接下来才能去访问其它的受限页面(但要带上登录Cookie)。
注意:由于登录Cookie通常是加密的,且会发生变化,因此直接在代码中硬编码指定登录Cookie会导致代码难以维护。
在前面的示例中,我已在web.config为MyInfo.aspx设置过禁止匿名访问,如果我用下面的代码去调用:
- private static readonly string MyInfoPageUrl = "http://localhost:51855/MyInfo.aspx";
- static void Main(string[] args)
- {
- // 这个调用得到的结果其实是default.aspx页面的输出,并非MyInfo.aspx
- HttpWebRequest request = MyHttpClient.CreateHttpWebRequest(MyInfoPageUrl);
- string html = MyHttpClient.GetResponseText(request);
- if( html.IndexOf("<span>Fish</span>") > 0 )
- Console.WriteLine("调用成功。");
- else
- Console.WriteLine("页面结果不符合预期。");
- }
此时,输出的结果将会是:
页面结果不符合预期。
如果我用下面的代码:
- private static readonly string LoginUrl = "http://localhost:51855/default.aspx";
- private static readonly string MyInfoPageUrl = "http://localhost:51855/MyInfo.aspx";
- static void Main(string[] args)
- {
- // 创建一个CookieContainer实例,供多次请求之间共享Cookie
- CookieContainer cookieContainer = new CookieContainer();
- // 首先去登录页面登录
- MyHttpClient.HttpPost(LoginUrl, "NormalLogin=aa&loginName=Fish", cookieContainer);
- // 此时cookieContainer已经包含了服务端生成的登录Cookie
- // 再去访问要请求的页面。
- string html = MyHttpClient.HttpGet(MyInfoPageUrl, cookieContainer);
- if( html.IndexOf("<span>Fish</span>") > 0 )
- Console.WriteLine("调用成功。");
- else
- Console.WriteLine("页面结果不符合预期。");
- // 如果还要访问其它的受限页面,可以继续调用。
- }
此