65.9K
CodeProject 正在变化。 阅读更多。
Home

假定域用户的身份通过CDO访问Exchange

starIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

1.00/5 (4投票s)

2004年11月15日

3分钟阅读

viewsIcon

33948

downloadIcon

171

一篇关于如何绕过访问内部网页时需要提供登录信息的文章。

引言

虽然我们都明白安全性的必要性,但在某些时候,您可能希望避免登录网页来通过协作数据对象 (CDO) 查看公共或公司邮箱/日历/任务列表。 此代码允许用户模拟现有用户的身份,并避免 NT 挑战响应提示。 它也可以用于任何希望允许访问通过 NT 身份验证访问的资源的地方。 这种方法实际上模拟了提供登录信息。

如果您在尝试访问 CDO 资源时未正确登录到 Exchange Server,您将收到以下错误消息

The information store could not be opened.
[MAPI 1.0 - [MAPI_E_LOGON_FAILED(80040111)]]

背景

在我的组织中,Outlook 邮箱用于代表会议室。 我们希望允许用户从公司内部网查看会议室的可用性。 我创建了一个简单的 ASP 页面,该页面利用 CDO 并将日历呈现到页面上,同时用户将参数传递到页面以指示房间的名称以及他们想要查看的日期。 一切都像您期望的那样简单明了。 然而,由于我们公司内部网上的用户默认情况下未通过 NT 身份验证,因此要查看该页面,用户需要登录到 NT 挑战响应。 由于多种原因,这被认为不可接受

  • 我们不想授予每个用户对邮箱的访问权限,因为我们不希望用户能够通过任何其他方式(例如,他们自己的 Outlook 客户端)访问邮箱。
  • 我们不想创建通用的登录名和密码,因为这将允许用户直接访问日历。
  • 我们认为,用户必须提供登录信息这一事实会抑制用户对这项新功能的接受程度

我到处搜索以找到解决此问题的方法,我找到的一篇文章为我指明了正确的方向.......... 使用 ServerXMLHTTP 向经过身份验证的用户的请求添加标头,然后收集日历并将其返回到调用页面。 上图说明了该过程。

使用代码

为了找到传递到标头所需的值,请使用 HTTP 嗅探器(例如 MS Fidler)来捕获用户通常通过 NT 挑战响应提示向页面提供登录信息时,对该页面的请求的标头详细信息。 然后,您将这些详细信息添加到 ServerXMLHTTP 请求的标头中,如下所示。 该脚本用作代理,将页面的值返回到调用页面。 该过程的工作方式如下

  1. 调用包含该函数的页面。
  2. 该页面调用该函数并添加该页面的标头,就像用户提供了他们的登录信息一样。
  3. 显示返回的结果。
function sendinfo()
Dim myhttp

  datatosend ="id=" & Request("id") & "&d=" & Request("d")
  Set myhttp=CreateObject("Msxml2.ServerXMLHTTP")
  myhttp.open "POST", _
    "{URL to Your page that uses CDO and requires authentication}", false
  myhttp.setRequestHeader "Authorization", _
    "Basic {your value goes here, will be Base64 Encoded eg.ttXUPPt50cmFuZXQ4ODc}"
  myhttp.setRequestHeader "Content-Type", "application/x-www-form-urlencoded"
  myhttp.setRequestHeader "LOCAL_USER", "{the Domain Account alias you are using}"
  myhttp.send datatosend
  sendinfo = myhttp.responseText
  set  myhttp = Nothing
end function

请注意,放置此脚本的服务器上应安装 MSXML 3.0 的副本。

关注点

小心邮箱和默认日历时区,确保它们都设置为一种类型,否则您将开始看到 Outlook 客户端和 ASP 界面之间的一些奇怪差异。

© . All rights reserved.