【发布时间】:2017-01-02 10:18:53
【问题描述】:
我正在开发一个将在本地使用的 Intranet 站点。在企业中,用户可以像 OWA 一样使用这个站点,他们可以看到他们的收件箱、发送邮件等。为了实现这一点,我使用 EWS Managed Api 2.2 连接 Exchange Server (2010_sp1)。我正在使用 ASPNet MVC 5 进行开发。我正在我的安装了 IIS 10.0 的计算机。当我使用 IISExpress 进行开发时,使用默认凭据连接没有问题 >
ExchangeService service = new ExchangeService(ExchangeVersion.Exchange2010_SP1);
service.UseDefaultCredentials = true;
我明白,这是因为 IIS Express 使用我的凭据作为默认凭据,因此连接服务没有错误。但是当我在我的计算机上使用 IIS 运行此代码时(在应用程序池标识中使用我的凭据,启用 ASPNet 模拟,启用 Windows 身份验证和 NEGOTIATE/NTML 提供程序)身份加载正确
HttpContext.User.Identity.Name > xxx\billgates
WindowsIdentity.GetCurrent().Name> xxx\billgates
但 Exchange 服务会在跟踪中返回这些 >
<Trace Tag="EwsRequestHttpHeaders" Tid="29" Time="2017-01-02 08:03:04Z">
POST /EWS/Exchange.asmx HTTP/1.1
Content-Type: text/xml; charset=utf-8
Accept: text/xml
User-Agent: ExchangeServicesClient/15.00.0913.015
Accept-Encoding: gzip,deflate
</Trace>
<Trace Tag="EwsRequest" Tid="29" Time="2017-01-02 08:03:04Z" Version="15.00.0913.015">
<?xml version="1.0" encoding="utf-8"?>
<soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:m="http://schemas.microsoft.com/exchange/services/2006/messages" xmlns:t="http://schemas.microsoft.com/exchange/services/2006/types" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Header>
<t:RequestServerVersion Version="Exchange2010_SP1" />
</soap:Header>
<soap:Body>
<m:GetFolder>
<m:FolderShape>
<t:BaseShape>AllProperties</t:BaseShape>
</m:FolderShape>
<m:FolderIds>
<t:DistinguishedFolderId Id="inbox" />
</m:FolderIds>
</m:GetFolder>
</soap:Body>
</soap:Envelope>
</Trace>
<Trace Tag="EwsResponseHttpHeaders" Tid="29" Time="2017-01-02 08:03:04Z">
HTTP/1.1 401 Unauthorized
Server: Microsoft-IIS/7.5
WWW-Authenticate: Negotiate,NTLM
X-Powered-By: ASP.NET
Date: Mon, 02 Jan 2017 08:03:04 GMT
Content-Length: 0
</Trace>
当我使用 EWEditor(https://ewseditor.codeplex.com/) 时,我看到使用默认凭据连接没有错误,并且在 powershell 中运行 klist 时出现类似 kerberos 的标记>
服务器:krbtgt/xxxxx.xxx.xx@xxxxx.xxx.xx KerbTicket 加密类型:RSADSI RC4-HMAC(NT) 结束时间:1/2/2017 21:35:37 续订时间:1/9/2017 11:35:37
服务器:krbtgt/xxxxx.xxx.xx@xxxxx.xxx.xx KerbTicket 加密类型:未知 (18) 结束时间:1/2/2017 21:35:37 续订时间:1/9/2017 11:35:37
服务器:HTTP/posta.xxxxx.xxx.xx@xxxxx.xxx.xx KerbTicket 加密类型:RSADSI RC4-HMAC(NT) 结束时间:1/2/2017 21:35:37 续订时间:1/9/2017 11:35:37
服务器:HTTP/autodiscover.xxxxx.xxx.xx@xxxxx.xxx.xx KerbTicket 加密类型:RSADSI RC4-HMAC(NT) 结束时间:1/2/2017 21:35:37 续订时间:1/9/2017 11:35:37
服务器:HTTP/xxxcas2.xxxxx.xxx.xx@xxxxx.xxx.xx KerbTicket 加密类型:未知 (18) 结束时间:1/2/2017 21:35:37 续订时间:1/9/2017 11:35:37
服务器:ldap/xxxDC2.xxxxx.xxx.xx@xxxxx.xxx.xx KerbTicket 加密类型:未知 (18) 结束时间:1/2/2017 21:35:37 续订时间:1/9/2017 11:35:37
有了这些票证,我假设 kerberos 可以工作,我的第一个问题是我是对的吗?我可以确定这些票证保证 keberos 可以与客户端访问服务器一起工作吗?
在搜索这个问题时,我看到这个问题很像这个博客所说的双跳问题>https://blogs.msdn.microsoft.com/dhruvkh/2012/04/15/the-double-hop-dogma/ .其实我的问题和这篇文章一模一样。像这篇文章一样,建议我使用我的帐户作为服务帐户并将 SPNS 添加到我的帐户中,并将其写入 IIS 中的应用程序池标识中
我使用的 SPN
http/autodiscover.xxxxxx.xxx.xx
http/posta.xxxxxx.xxx.xx
注意:我确定没有使用这些 SPN。
添加 spns 后,我还选中“信任此计算机以委托任何服务(仅限 Kerberos)”。在我的用户帐户的委派选项卡中。
我的另一个问题是喜欢在 3. step https://technet.microsoft.com/en-us/library/ff808312(v=exchg.141).aspx 上的帖子建议 我应该创建一个备用服务帐户而不是使用我的帐户吗?如果我必须使用 ASA,我应该在 IIS 应用程序池标识中添加备用服务帐户凭据吗?
感谢您的帮助。
【问题讨论】:
标签: asp.net-mvc iis exchange-server-2010 ews-managed-api kerberos-delegation