ローカルネットワークで使用したいアプリに対して、次の設定があります。
Silverlight Client App -> Web Server (data objects etc) | -> Exchange
| -> SQL Database
他のすべては正常に機能し、DBなどからデータを取得できます(Windows認証ではなくSQLにSQL認証を使用していることに注意してください)が、ExchangeWebサービスを使用してExchangeから現在のユーザーのカレンダーエントリを取得しようとするとエラーが発生します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()
後、ユーザーが偽装したいユーザーのIDに変更されていることがわかります。Impersonate
AuthenticationTypeはKerberos
であり、ImpersonationLevel
はですImpersonate
。私が見る限り、これは機能するはずですが、私のWebサーバーはExchangeで正常に認証することを望んでいないようです。
セットアップまたは交換で何かが足りませんか?