TFSイベントサブスクリプションサービスを使用して、Webインターフェイスを介してサブスクリプションを動的に作成しようとしています。サブスクリプションは中間アカウントに送られます。ここでは、2つのアカウントを「非管理者ユーザー」と「サブスクリプションストレージ」と呼びます。
管理者は「サブスクリプションストレージ」アカウントのアラートを作成でき、サブスクリプションストレージアカウントはそれ自体のアラートを作成できますが、管理者以外のユーザーはストレージアカウントにサブスクリプションを作成できません。次のエラーメッセージが表示されます。
アクセスが拒否されました:{ユーザーアカウント名}は、リソース$ SUBSCRIPTIONに対して次の権限が必要です:このアクションを実行するには:編集
私が使用しているコードは次のとおりです。
IEventService eventService = (IEventService)this.tfsCollection.GetService(typeof(IEventService));
eventService.SubscribeEvent(userAccountIdentity.Sid, Strings.WorkItemChangedEvent, string.Format(Strings.Condition0, workItem.ToString(CultureInfo.InvariantCulture)), deliveryPreference, string.Format(Strings.AlertTag0, workItem.ToString(CultureInfo.InvariantCulture)));
すべてのパラメーターが正しく、それらの値はこの議論には無関係であることを信じてください。:)tfsCollection
は、ページのプロパティTfsTeamProjectCollection
に由来するオブジェクトです。Connection.TeamProjectCollection
私の最初の考えは、サービスアカウント(この場合はNetworkService)を使用するように偽装を解除することでした。そこで、Action
次のように、を取得して偽装なしで実行する拡張メソッドを作成しました。
public static void WithoutImpersonation(this Action actionToPerform)
{
using (var ctx = WindowsIdentity.Impersonate(IntPtr.Zero))
{
try
{
actionToPerform();
}
finally
{
ctx.Undo();
}
}
}
Action
これにより、 (チェックするとユーザーアカウントではなくNetworkServiceアカウントが返されます)の間、偽装が正しくWindowsIdentity.GetCurrentUser()
解除されますが、同じエラーでイベントサブスクリプションの作成に失敗します。の認証されたユーザーTfsTeamProjectCollection
は、NetworkServiceアカウントでもあります。