对于要在本地网络上使用的应用程序,我有以下设置:
Silverlight Client App -> Web Server (data objects etc) | -> Exchange
| -> SQL Database
其他一切正常,我可以从数据库等中获取数据(可能值得注意的是,我正在使用 SQL 身份验证而不是 Windows 身份验证),但是当我尝试使用 Exchange Web 服务从交换中获取当前用户的日历条目时它给了我一个401 unauthorised
错误。
这一切都在我的本地开发服务器(在我的机器上)上运行,该服务器使用默认的 ApplicationPoolIdentity 在经典的 ASP.NET 4 应用程序池下运行。我不是通过 SSL 进入的,只是通过端口 81
我可以连接以获取自己的日历条目,但对于其他用户,我收到错误
如果我在没有模拟代码的情况下尝试它,我会收到一个Connection did not succeed. Please try again later
错误,因为我假设 EWS 将使用没有域登录的 ApplicationPoolIdentity。
我使用以下代码来模拟(暂时忽略任何可能未处理的异常/安全漏洞,我只想让它工作!):
var impersonationContext = ((System.Security.Principal.WindowsIdentity)System.Threading.Thread.CurrentPrincipal.Identity).Impersonate();
// Use default credentials
service.UseDefaultCredentials = true;
// Get the target folder ID using the email address
var folder = new FolderId(WellKnownFolderName.Calendar, new Mailbox(emailAddress));
// Get the appointments
var response = service.FindAppointments(folder, view);
impersonationContext.Undo();
// Return list of appointment entities
return response.Items;
查看显示,在调用该方法System.Security.Principal.GetCurrent()
后,用户更改为我要模拟的用户的身份。Impersonate
AuthenticationType isKerberos
和ImpersonationLevel
is Impersonate
。据我所知,这应该可以工作,但看起来我的网络服务器不想通过交换成功进行身份验证。
我是否在设置中遗漏了某些东西或作为交换?