У меня есть ASP.NET application
, который использует проверку подлинности на основе утверждений по ADFS.Я также сопоставляю его с WindowsClaimsIdentity
с помощью службы утверждений Windows Identity Service.Это прекрасно работает.
Но теперь мне нужно выдать себя за текущий запрос / поток, чтобы я мог получить доступ к сервису, который не знает претензий.Как мне это сделать?
Должен ли я получить WindowsImpersonationContext
в событии Application_PostAuthenticate
и сохранить его в HttpContext.Items
, а затем в Application_EndRequest
вызвать метод Undo?
Или есть другие предпочтительные способы сделать это?
Обновление: Поскольку я не получил никаких подсказок о том, какой способ выдать себя за себя, я попробовал свое собственное предложение.Я создал этот код в global.asax.cs:
private static readonly string WICKey = typeof(System.Security.Principal.WindowsImpersonationContext).AssemblyQualifiedName;
protected void Application_PostAuthenticateRequest()
{
var wid = User.Identity as System.Security.Principal.WindowsIdentity;
if (wid != null)
{
HttpContext.Current.Trace.Write("PostAuthenticateRequest PreImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
HttpContext.Current.Items[WICKey] = wid.Impersonate();
HttpContext.Current.Trace.Write("PostAuthenticateRequest PostImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}
}
protected void Application_EndRequest()
{
var wic = HttpContext.Current.Items[WICKey] as System.Security.Principal.WindowsImpersonationContext;
if (wic != null)
{
HttpContext.Current.Trace.Write("EndRequest PreUndoImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
wic.Undo();
HttpContext.Current.Trace.Write("EndRequest PostUndoImpersonate: " + System.Security.Principal.WindowsIdentity.GetCurrent().Name);
}
}
Когда я смотрю в журнал трассировки, я вижу это
PostAuthenticateRequest PreImpersonate: NT AUTHORITY\NETWORK SERVICE
PostAuthenticateRequest PostImpersonate: MyDomain\CorrectUser
Home: NT AUTHORITY\NETWORK SERVICE
EndRequest PreUndoImpersonate: NT AUTHORITY\NETWORK SERVICE
EndRequest PostUndoImpersonate: NT AUTHORITY\NETWORK SERVICE
Итак, во второй строке вы можете увидеть потоквыдает себя правильноНо в следующих строках вы видите, что олицетворение потеряно.(третья строка происходит от контроллера).
Когда я использую следующий код для олицетворения локально, он работает нормально:
var wid = User.Identity as System.Security.Principal.WindowsIdentity;
if (wid != null)
{
using (var ctx = wid.Impersonate())
{
//Do something
}
}
Но я хочу выдать себя за весь срок действия запроса.Как мне это сделать?