使用CredentialCache.DefaultNetworkCredentials代表当前用户发送电子邮件

时间:2013-10-28 16:33:39

标签: .net vb.net exchange-server kerberos exchangewebservices

存在什么
一个Web应用程序,允许用户创建约会,输入所需的与会者,并发送约会请求。

我想要发生的事情:
我的网络应用程序通过EWS向多个收件人发送预约请求(代表使用该网络应用程序的用户)。 避免使用EWS的模拟选项

我尝试了什么:

Dim service As New ExchangeService(TimeZoneInfo.FindSystemTimeZoneById(sNewEmpTZ))
service.Url = New Uri("https://exchange.url")

Dim cred As NetworkCredential = CredentialCache.DefaultNetworkCredentials

service.Credentials = cred

Dim app As Appointment = New Appointment(service)
'build required body, subject, attendees, location, time, date etc.

app.Save(SendInvitationsMode.SendToAllAndSaveCopy)

发生了什么:
当我通过我的localhost运行这个应用程序时,它完美无缺 - 将获得当前用户(我)下的缓存凭据并发送约会请求。当我将此代码滚动到我们的开发服务器时,在代码尝试发送约会(app.Save(...))后,我收到以下错误消息:
Error: When making a request as an account that does not have a mailbox, you must specify the mailbox primary SMTP address for any distinguished folder Ids.
这告诉我代码无法获取当前用户的凭据。 注意:我们的开发服务器使用Kerberos进行身份验证,这就是我认为代码应该工作的原因。

我研究的内容:
过去两天我一直在查看此错误消息,但我找不到具有解决方案的类似情况。

我还尝试了什么:
我知道CredentialCache.DefaultCredentials基本上是等价的,所以我确实尝试了

Dim service As New ExchangeService(TimeZoneInfo.FindSystemTimeZoneById(sNewEmpTZ))
service.Url = New Uri("https://exchange.url")

Dim cred As ICredentials = CredentialCache.DefaultCredentials

service.Credentials = cred

Dim app As Appointment = New Appointment(service)
'build required body, subject, attendees, location, time, date etc.

app.Save(SendInvitationsMode.SendToAllAndSaveCopy)

但是对于本地和开发人员我都会收到以下错误:Unable to cast object of type 'System.Net.SystemNetworkCredential' to type 'Microsoft.Exchange.WebServices.Data.ExchangeCredentials'.

我的问题:

知道我们的开发服务器设置为使用Kerberos协议,并且用户 进行了Windows身份验证,为什么CredentialCache.DefaultNetworkCredentials无法收集当前用户的凭据?

声明: 我对Windows身份验证的实际工作方式非常了解。此外,在发布类似的堆栈溢出问题之前,我已经回顾了以下两个似乎与我的问题最相关的问题。

  • http://stackoverflow.com/questions/12851705/ad-user-authentication
  • http://stackoverflow.com/questions/949340/getting-networkcredential-for-current-用户-C

1 个答案:

答案 0 :(得分:0)

只是一个猜测,但您是否在ASP.Net Impersonation打开的情况下尝试了它?