CSharp Tips:应用程序访问集成Windows认证的站点

原创 2003年11月20日 00:26:00
问题
从事过Web Application的人都知道,在一个Web Site可以允许用户匿名访问,也可以禁止匿名强制要求认证才能够访问。
在IIS的Directory Property/Directory Security下可以看到匿名访问(Anonymous access)和认证访问(Authenticated access)的选项。在认证访问中又有多种方式:基本认证(Basic)、摘要认证(Digest),还有著名的Windows集成(Integrated Windows authentication,以前应该叫做Challenge/Response)。
当选择和认证访问的时候,如果没有经过认证,任何请求都会被服务器拒绝,返回401-Unauthenticated的错误。通过IE访问Web Site,浏览器会帮你做掉很多事情,特别是当选择Windows集成模式,而用户又是登录域的,对用户感觉完全透明。但是在应用程序中怎么才能够向一个要求认证访问的站点发送请求呢?这就是我们的问题所在。
 
原因
在DotNet下面我们通常采用System.Web.HttpWebRequest/HttpWebResponse来完成有关HTTP的操作,对于客户端来说比较重要的就是发送请求的HttpWebRequest。
普通情况下,我们创建一个请求:
   oRequest = (System.Net.HttpWebRequest) WebRequest.Create(uri);
   if (oRequest != null)
   {
    // send request
    oRequest.ProtocolVersion = HttpVersion.Version11;
    oRequest.Method = @"GET";
    oResponse = (System.Net.HttpWebResponse) oRequest.GetResponse();
    }
这段代码请求允许匿名访问的站点的时候没有任何问题,但是当站点关闭匿名访问的开关的时候,就会收到上面提到的401的错误。因为我们并没有指定访问该站点的用户ID。
 
解决
HttpWebRequest类中有一个属性Credentials,该属性就是用来存放认证信息的。
如果希望用当前登录用户的认证信息,可以这么赋值:
     oRequest.Credentials = CredentialCache.DefaultCredentials;
CredentialCache.DefaultCredentials记录了应用程序当前运行上下文中的认证信息,但是你无法从中读取用户名、口令和登录域(都是空字符串),不过确确实实记录了当前登录用户的信息,这也是Windows的保护机制吧。
 
如果希望用一个指定用户的身份访问,那么就必须提供用户名,口令和域名:
     oCredential = new NetworkCredential(sUser,sPwd,sDomain);
     oRequest.Credentials = oCredential.GetCredential(new Uri(uri),String.Empty);
在GetCredential方法中可以指定认证方式,也就是“Basic”、“NTLM”之类。具体参数含义,参考MSDN。
完整的例子
   oRequest = (System.Net.HttpWebRequest) WebRequest.Create(uri);
   if (oRequest != null)
   {
    // send request
    oRequest.ProtocolVersion = HttpVersion.Version11;
    oRequest.Method = @"GET";
    if (sUser != String.Empty)
    {
     oCredential = new NetworkCredential(sUser,sPwd,sDomain);
     oRequest.Credentials = oCredential.GetCredential(new Uri(uri),String.Empty);
    }
    else
    {
     oRequest.Credentials = CredentialCache.DefaultCredentials;
    }
    oResponse = (System.Net.HttpWebResponse) oRequest.GetResponse();
    }
这样只要当前登录用户或者你提供帐号和口令的用户通过任何,你就可以像普通情况下一样访问Web Site上的资源了。当然如果提供了错误的用户名或者口令的话,不要来找我。
DotNet下非常简单,就到这里。
 
IE做了点什么?
题外话,谈谈当访问一个需要认证的站点的时候,IE做了点什么。
当服务端选择集成Windows的认证模式时,用户通过IE请求被保护的资源,服务端返回一个401的错误码,以及一个WWWW-Authenticate的HTTP报头(Header)。IE收到这个Header之后,将当前用户名、机器名和域名传递给服务端,服务端继续回应一个401的错误码以及WWW-Authenticate的报头。这是IE换算Password再次发送给服务端,这个时候认证才算完成。
如果当前登录Windows的用户没有权限访问服务端的资源,IE就会弹出一个对话框,要求用户输入访问用户名、口令和域名,再次重复上述过程。如果用户三次输入错误的信息,那么IE也玩不动了,直接告诉你“未经授权”。
可见IE还是做了很多事情的。如果我们要写一个比较好的客户端程序,也需要重复考虑这些问题。
 
 
参考文档
 
 
 

CSharp Tips:应用程序访问集成Windows认证的站点

CSharp Tips:应用程序访问集成Windows认证的站点document.title="CSharp Tips:应用程序访问集成Windows认证的站点 - "+document.title ...
  • soya21
  • soya21
  • 2006年01月12日 19:04
  • 687

Web Services验证实例--SharePoint内置windows和form验证

SharePoint内置了一套相对比较完整的Web Services提供给开发者,这样就可以在客户端、跨平台的程序中读取甚至修改SharePoint中的内容。不过当SharePoint网站不允许匿名访...
  • hotnet522
  • hotnet522
  • 2011年11月04日 16:34
  • 956

将集成Windows认证并使用了身份模拟的ASP.net应用改成Form认证

先在Web.config里设置成Form认证:                        当然还得使用Session: 以及配置站点/虚拟目录为匿名认证 然后是一个身份模拟的辅助类:public ...
  • cnlike
  • cnlike
  • 2007年06月29日 14:41
  • 1305

ASP.NET MVC - Windows集成验证问题

ASP.NET 4.0 问题: 启用Windows Auth,页面请求总是跳转到一个Login.aspx页面解决:在web.config中添加以下配置到appSettings中 add key="au...
  • jameszhou
  • jameszhou
  • 2013年11月19日 22:53
  • 3161

Eclipse 插件安装与卸载的10个小窍门

Eclipse Galileo拥有一个全新的插件安装对话框。事实上,整个过程完全重新分解了。这在Eclipse已成为一种惯例:Eclipse 3.3和3.4分别拥有完全不同的插件安装程序。51CTO编...
  • beyond_liyy
  • beyond_liyy
  • 2011年05月18日 16:04
  • 4708

基于Winserver2016服务器的AD域单点登录

包含winserver2016环境搭建  exchange2013邮箱服务器集成 AD域用户权限分配 单点登录实现 详细信息 请去我的网盘下载 地址: https://pan.baidu.com/...
  • qq_32725403
  • qq_32725403
  • 2018年02月05日 15:23
  • 46

如何启用集成windows身份认证

在windows 2003 下装了.NTE2003用ASP.NET编Web服务启动时弹出一错误提示:无法在web服务器上启动调试.调试失败,因为没有启用集成windows身份任证解决方法如下:打开II...
  • yinyaling
  • yinyaling
  • 2009年12月30日 09:55
  • 764

JAVA中如何集成AD域用户认证

最近在一个大项目中碰到有人需要在JAVA中如何集成AD域用户认证,这个问题从纯粹的技术角度来讲还真是不难,大不了自己将NTLM或者Kerberos的协议实现一遍,终归可以将此事搞定,不过世界上汽车轮子...
  • jackxinxu2100
  • jackxinxu2100
  • 2011年09月15日 23:23
  • 23735

授权时出现“你所访问的站点在新浪微博的认证失败”error:redirect_uri_mismatch

今天做了一个新浪微博oauth2.0授权认证 测试认证时一直出错 授权时出现“你所访问的站点在新浪微博的认证失败”error:redirect_uri_mismatch 网上查了查都说是应用...
  • wangzhen19891010
  • wangzhen19891010
  • 2014年03月10日 19:24
  • 4666

一个IIS下多个站点的方法

C:\Windows\System32\Drivers\Etc目录下的hosts文件主要用于域名解释。 校园网上不了天涯论坛了?有个猛人给了个好方法:他说:我前段时间也上不去。就给天涯发了个邮件...
  • llns1
  • llns1
  • 2012年05月18日 09:47
  • 1928
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:CSharp Tips:应用程序访问集成Windows认证的站点
举报原因:
原因补充:

(最多只允许输入30个字)