Олицетворение ASP.NET утверждает идентичность Windows идентичности - PullRequest
5 голосов
/ 03 февраля 2012

У меня есть 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
            }
        }

Но я хочу выдать себя за весь срок действия запроса.Как мне это сделать?

Ответы [ 2 ]

1 голос
/ 03 февраля 2012

Вы сказали, что бэкэнд-сервис не знает претензий.Вы можете остановиться на этом?Вы имеете в виду, что скомпилированный код не знает претензий, но у вас есть возможность изменить файл web.config?Если это так, то вы можете попытаться настроить внутреннюю службу для использования конвейера WIF для authN, добавив WSFederationAuthenticationModule, SessionAuthenticationModule и пользовательский ClaimsAuthorizationManager, если вам также необходимо выполнить authZ.Затем вы можете использовать функции ActAs или OnBehalfOf в WIF, когда ваше приложение ASP.NET вызывает внутреннюю службу.

0 голосов
/ 17 августа 2017

Извините за то, что вырыли этот старый поток, но чтобы ваш код работал, убедитесь, что для управляемого режима конвейера пула приложений, на котором запущено ваше приложение, установлено значение Классический .

...