Войти пользователя в приложение ASP.net с использованием проверки подлинности Windows без использования проверки подлинности Windows? - PullRequest
0 голосов
/ 28 мая 2010

У меня есть приложение ASP.net, для которого я разрабатываю аутентификацию. Я использую существующую систему регистрации на основе файлов cookie для входа пользователей в систему. Приложение запускается как анонимная учетная запись, а затем проверяет cookie, когда пользователь хочет сделать что-то ограниченное. Это работает нормально.

Однако есть одно предостережение: мне сказали, что для каждой страницы, которая подключается к нашему SQL-серверу, мне нужно сделать так, чтобы пользователь подключался с использованием учетной записи Active Directory. Поскольку система, которую я использую, основана на файлах cookie, пользователь не вошел в Active Directory. Поэтому я использую олицетворение для подключения к серверу в качестве определенной учетной записи.

Однако, находящиеся здесь силы не любят подражание; они говорят, что это загромождает код. Я согласен, но я не нашел способа обойти это. Кажется, что единственный способ, которым пользователь может войти в приложение ASP.net, это либо подключиться к Internet Explorer с компьютера, на котором пользователь вошел в систему с использованием своей учетной записи Active Directory, либо введя имя пользователя и пароль Active Directory. Ни один из этих двух вариантов не работает в моем приложении.

Я думаю, было бы неплохо, если бы я мог сделать так, чтобы при входе пользователя в систему и получении файла cookie (кстати, фактически из отдельного приложения входа в систему) мог выполняться какой-то код, который сообщает приложение для выполнения всех сетевых операций в качестве учетной записи Active Directory пользователя, как если бы они ввели имя пользователя и пароль Active Directory.

Кажется, это как-то возможно, но решение уклоняется от меня. Как я могу сделать эту работу?

Обновление Тем, кто до сих пор ответил, я прошу прощения за путаницу, которую я вызвал. Ответы, которые я получил, указывают на то, что вы неправильно поняли вопрос, поэтому, пожалуйста, позвольте мне уточнить.

У меня нет контроля над требованием , что пользователи должны выполнять сетевые операции (например, запросы SQL) с использованием учетных записей Active Directory. Мне несколько раз говорили (онлайн и в мясном пространстве), что это необычное требование и, возможно, плохая практика.

У меня также нет контроля над требованием , что пользователи должны входить в систему, используя существующее приложение для входа на основе файлов cookie. Я понимаю, что в идеальной экосистеме MS я просто запретил бы анонимный доступ в настройках IIS, и пользователи могли бы входить в систему с использованием аутентификации Windows. Это не тот случай . Текущая система заключается в том, что в отношении IIS пользователь регистрируется анонимно (даже если они предоставляют учетные данные, которые приводят к выдаче cookie), и мы должны программно проверить cookie, чтобы увидеть, имеет ли пользователь доступ к каким-либо ограниченным ресурсам .

В прошлом мы просто использовали одну учетную запись SQL для выполнения всех запросов. Мой непосредственный руководитель (который имеет многолетний опыт работы с подобными вещами) хочет изменить это. Он говорит, что если у каждого пользователя есть собственная учетная запись AD для выполнения SQL-запросов, это дает нам больше возможностей следовать, если кто-то пытается что-то сделать неправильно.

Самым близким, что мне удалось придумать, является использование WIF для предоставления пользователю права доступа к определенной учетной записи Active Directory, но мне все равно приходится использовать олицетворение, потому что даже в процессе ASP.net представлены анонимные учетные данные для SQL-сервер.

Это сводится к следующему: Могу ли я войти в систему с учетными записями Active Directory в моем приложении ASP.net, не заставляя пользователей вручную вводить свои учетные данные AD? (Аутентификация Windows)

Обновление 1 июня: Я попытался заменить принципала HttpContext.Current.User на принципал, созданный из идентификатора, возвращенного C2WTS в global.asax. global.asax выглядит нормально, но после запуска метода аутентификации выдается следующее исключение:

[UnauthorizedAccessException: попытка выполнить несанкционированную операцию.]System.Security.Principal.WindowsIdentity.get_AuthenticationType () +2176525 Microsoft.IdentityModel.Claims.WindowsClaimsPrincipal..ctor (удостоверение WindowsIdentity, имя источника строки) +82 Microsoft.IdentityModel.Claims.WindowsClaimsPrincipal.CreateFromWindowsIdentity (удостоверение WindowsIdentity, имя источника строки) +138 Microsoft.IdentityModel.Claims.ClaimsPrincipal.CreateFromPrincipal (IPrincipal Principal, String windowsIssuerName) +225 Microsoft.IdentityModel.Claims.ClaimsPrincipal.CreateFromHttpContext (HttpContext httpContext, логический clientCertificateAuthenticationEnabled) +67 Microsoft.IdentityModel.Web.WSFederationAuthenticationModule.OnPostAuthenticateRequest (Отправитель объекта, EventArgs e) +45 System.Web.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute () +68 System.Web.HttpApplication.ExecuteStep (шаг IExecutionStep, логическое и завершено синхронно) + 75

Еще раз спасибо всем, кто помогает с этим.

Обновите снова

Поразмыслив над этим, я нашел эту страницу: http://www.leastprivilege.com/GenevaHTTPModulesClaimsPrincipalHttpModule.aspx. Автор указывает, что в WIF-классе есть класс, с которым я еще не знаком, и который называется WindowsClaimsIdentity, который выглядит как гибрид Windows / Претензия Идентичность. Я пытаюсь найти способ настроить свое подражание с помощью этого класса. Чтобы установить эту личность при входе пользователя, я использую класс ClaimsAuthenticationManager. Я думаю, что я все ближе к решению.

Обновите снова

В ответ на последний ответ я успешно создал объект WindowsPrincipal. Я успешно использовал WindowsPrincipal для олицетворения в коде. Однако выполнение олицетворения с web.config (именно этого хочет босс) не работает. У меня проблема сузилась еще немного.

Существует три места, из которых вы можете получить зарегистрированного пользователя:

HttpContext.Current.User Thread.CurrentPrincipal WindowsPrincipal.GetCurrent

HttpContext.Current.User и Thread.CurrentPrincipal оба возвращают удостоверение личности, подлежащее преобразованию в принципала Windows. Однако WindowsPrincipal.GetCurrent по-прежнему возвращает учетную запись, указанную в разделе «Анонимный доступ» конфигурации IIS. В прошлом я пытался войти в систему с помощью Windows Authentication (что, как я уже говорил, я абсолютно не могу использовать с этим приложением), что приводит к тому, что WindowsPrincipal.GetCurrent возвращает учетную запись вошедших в систему пользователей. Что я должен сделать, чтобы WindowsPrincipal.GetCurrent возвратил учетную запись пользователя без Windows Authentication?

Ответы [ 5 ]

1 голос
/ 28 мая 2010

Поскольку Rising Star указала, что переключение на проверку подлинности Windows не вариант, как насчет выполнения олицетворения в коде? Единственное предостережение в том, что вам нужно знать пароль пользователя. На самом деле, я бы сказал, что если у вас нет доступа к паролю пользователя, выдать себя за пользователя невозможно.

Я думаю, что класс WindowsImpersonation может предоставить то, что вам нужно. Пример того, как сделать это с определенным идентификатором и паролем, можно найти в MSDN .

Оригинальный ответ

Можете ли вы переключить свое приложение с текущего метода аутентификации на аутентификацию Windows? В этом случае, если вы включите олицетворение без указания идентификатора / пароля, ваше приложение будет олицетворять вошедшего в систему пользователя, которого, я считаю, вы ищете.

Очень подробное объяснение этой настройки можно найти здесь .

0 голосов
/ 14 июля 2012

Вы должны настроить свой сайт на использование служебной учетной записи, специфичной для сайта, которая будет иметь доступ к базе данных. Это не имеет отношения к учетным записям, используемым для доступа к сайту. Они являются отдельными, имитация не должна быть необходимой для удовлетворения требований.

Проблема заключается в вашем предположении и предположении большинства (если не всех ответов), что учетная запись AD, которая обращается к SQL Server, должна быть учетной записью, представляющей аутентифицирующего пользователя.

Включение олицетворения только создает проблемы для решения.

Мое вступительное заявление заключается в том, как обеспечивается безопасность доступа к большинству сайтов -> БД, дополнительные (не заменяющие) механизмы включают IPSec, безопасные туннели и т. Д. Первым делом стоит выделить «учетную запись службы» (и учетную запись AD для использовать Сайт для защиты связи не только с MSSQL, но и ВСЕМИ сетевыми ресурсами.)

0 голосов
/ 31 мая 2010

Я все еще немного запутался с терминологией здесь. Но я думаю, что вы в беде:)

По моему мнению / пониманию, следующие два утверждения уже говорят вам, что то, что вы хотите, невозможно:

Мне сказали, что для каждой страницы подключается к нашему серверу SQL, мне нужно сделать так, чтобы пользователь подключался используя учетную запись Active Directory.

против

Однако силы, которые здесь находятся, не как олицетворение;

Я бы сказал, что первое утверждение подразумевает подражание . Кстати, я считаю, что это очень распространенное требование. Главным образом по той причине, которую вы указали: она позволяет вам видеть, кто что делает в вашей базе данных. Это может даже быть (или стать) требованием закона ... Обычно вам не нужно давать разрешения отдельным лицам, хотя я склонен использовать группы / роли.

Теперь в своем комментарии к @Mauro вы пишете

У меня есть cookie, который содержит объявление аккаунт я хочу выполнить SQL запрос как. Мой единственный вопрос, как сделать Я заставляю процесс asp.net запускать SQL запрос как личность, указанная печенье?

Что вы подразумеваете под "содержит учетную запись AD"? Просто имя пользователя или имя пользователя и пароль ? Если у вас есть оба, вы можете (должны?) Следовать статье MSDN ( WindowsImpersonationContext ), упомянутой @Jeff Siver (или это то, что вы и ваше руководство называете «загромождением кода»?).
Если у вас нет пароля, вам не повезло. Как бы вы могли запустить что-то с привилегиями определенного пользователя, не предоставляя системе никакой подсказки (кроме имени пользователя), что вам разрешено это делать? Сейчас я не вижу, как здесь может помочь печенье. Если - хм - может быть, вы могли бы свернуть своего собственного руководителя безопасности ? Это выше меня, хотя.

В случае, если у нас (пока) нет одинакового понимания некоторых терминов: это будет (или, скорее, мой) список «обычных подозреваемых», способных привести к недоразумениям.

  • Аутентификация Windows: опция в IIS вместо встроенной аутентификации Windows в SQL Server
  • Олицетворение: Параметр ASP.NET (как указано @JustLoren) против имитации в коде ("загроможденный код"?)
  • Делегирование: передача учетных данных из IIS в SQL Server (например) против тройного перехода (передача учетных данных из IE (или браузера) в IIS в SQL Server; также является своего рода делегирование)

UPDATE
WIF, кажется, приносит определенную сложность, см. Рисунок 7 и Рисунок 8 в Обзор архитектуры на основе утверждений , которую можно найти в Windows Identity Foundation Упрощает доступ пользователей для разработчиков . И я должен признать, что я не знаю WIF. Из того, что я вижу, это может действительно помочь вам; или это может просто "переложить проблему" ...

НО от вашего комментария

У меня есть участник безопасности с учетной записью AD пользователя

Я думаю, что вы могли бы изменить личность пользователя, «запускающего веб-приложение» (то есть совершающего вызовы в базу данных), используя механизм, который также можно использовать для развертывания вашего собственного «решения принципала безопасности».

Я не уверен, что вам все еще нужен impersonate в Web.config, как предложено @JustLoren. Но это вполне может быть.

Вы бы начали с замены текущего участника безопасности на «свой» (тот, который вы получаете через C2WTS) в Global.asax s Application_AuthenticateRequest -методе (надеюсь, он все равно будет вызываться, если вы разрешите анонимный доступ? !?). Но будьте осторожны Я бы сказал, это отнюдь не тривиально.

Вы можете найти больше информации (и предупреждений) здесь:

ОБНОВЛЕНИЕ2

Итак .... Вы говорите, что ответ на мой вопрос может быть как-то заменить текущий участник безопасности в этом методе?

Это то, что я имел в виду, да. Вот пример кода (отрывки чего-то без WIF, который я знаю, чтобы работать).

Класс пользовательских принципов (который вам не нужен):

using System;
using System.Collections.Generic;
using System.Web;
using System.Security.Principal;

namespace PrincipalTest
{
    [Serializable]
    public class MyPrincipal : WindowsPrincipal
    {
        public MyPrincipal(WindowsIdentity ntIdentity) : base(ntIdentity)
        {
        }

        public bool IsAdmin
        {
            get
            {
                bool isAdmin = (string.Compare(this.Identity.Name,
                        @"<domain>\<user>", StringComparison.OrdinalIgnoreCase)
                        == 0);
                return isAdmin;
            }
        }
    }
}

В Global.asax (здесь вы бы использовали магию WIF):

protected void Application_AuthenticateRequest(object sender, EventArgs e)
{
    DotnetReportingPrincipal principal =
            new MyPrincipal(HttpContext.Current.User.Identity
            as WindowsIdentity);

    // Attach the new principal object to the current HttpContext object
    HttpContext.Current.User = principal;
    System.Threading.Thread.CurrentPrincipal
            = System.Web.HttpContext.Current.User;
}

Затем вы можете делать такие вещи (опять же, в вашем случае это не требуется):

protected void Page_Load(object sender, EventArgs e)
{
    IPrincipal current = HttpContext.Current.User;
    if (current is MyPrincipal)
    {
        if (current as DotnetReportingPrincipal).IsAdmin) 
        {
            ...
        }
    }
}

В вашей ситуации я бы попробовал (надеюсь :)), что вы можете просто настроить ASP.NET на использование олицетворения (опять же, как предложено @JustLoren). Надеемся, что IIS передаст «нового» пользователя SQL Server для запросов.

Если это не так, убедитесь, что ваша конфигурация допускает делегирование. Вот несколько подсказок:

Пожалуйста, помните, что я здесь на очень тонком льду. Но - кто знает ...
Возможно, вам удастся добиться чего-то, что было продемонстрировано в демонстрационной версии Microsoft, совсем неплохо:)
Удачи!

Anotherupdate
Хм - я не уверен, что мне нравится, как здесь идут дела;) Я искренне надеюсь, что не указал вам неправильное направление ...

Как вы сказали, есть класс WindowsClaimsIdentity:

есть класс в WIF, что я не знакомы с Android WindowsClaimsIdentity, который кажется Быть гибридом Windows / Претензий. Я пытаюсь найти, как настроить мой олицетворение с использованием этого класса.

Но там написано:

Если клиент использует Windows аутентификация , создайте WindowsClaimsPrincipal. Этот принципал позволяет скачивать WindowsPrincipal и WindowsIdentity (для доступа к вещам как олицетворение и другие окна особенности безопасности).

И ваш клиент не использует проверку подлинности Windows, я полагаю. Так что не будет WindowsPrincipal; что является плохой новостью.

Чтобы ваш сценарий сработал, вам, в конце концов, нужен WindowsPrincipal, я вполне убежден. Это потому, что я считаю, что это единственное, что вы можете передать SQL Server. Итак, вопрос: как вы получаете WindowsPrincipal из "вашего печенья"?

То, как вы сейчас делаете что-то, вы, кстати, уже можете получить WindowsPrincpal; но не тот, боюсь. Зачем? Потому что у вас нет <authentication mode="Windows" /> в вашем Web.config. Или, если он у вас есть и вы разрешаете анонимный доступ (что вы и делаете), вы в конечном итоге получите учетную запись Windows Principal NETWORK SERVICE или компьютера (вы можете легко проверить это и сказать, если я ошибаюсь).

Кстати: у вас есть любой <authentication mode="..."> в Web.config? Я так не думаю!?!

Итак, еще раз: как вы можете получить WindowsPrincipal для текущего пользователя из имеющейся у вас информации cookie?

Вот мои мысли (я должен признать, что они оставляют во рту немного дурного запаха; это похоже на переизобретение колеса (SSO) ...).

  1. Настройте ваше приложение, чтобы разрешить анонимный доступ в IIS (как я понимаю, это требование).
  2. Настройте приложение на использование олицетворения (см. Web.config, см. Ответ @ JustLoren)
  3. Используйте код в разделе «Получение токена Windows для исходного абонента» в Как: использовать переход по протоколу и ограниченное делегирование в ASP.NET 2.0 , чтобы получить WindowsIdentity в Global.asax s Application_AuthenticateRequest -метод (используя информацию об имени пользователя и пароле, которую можно надеяться получить из «системы cookie»).
  4. Создайте WindowsPrincipal из этого WindowsIdentity, как описано в разделе «Чтобы создать объект WindowsPrincipal для отдельной проверки», шаг 2 в Как: создать объект WindowsPrincipal ;по сути, делая WindowsPrincipal MyPrincipal = new WindowsPrincipal(MyIdentity);.
  5. Прикрепите созданный вами WindowsPrincipal к текущему HttpContext и потоку (как предложено в "Update2").
  6. Скрестите пальцы :) Но я уверенуверенность в этом.Шаткая часть, кажется, получить правильный WindowsIdentity ...

Yetanontherupdate
В разделе «Выдавать себя за конкретного пользователя в коде» статьи Как реализовать олицетворение в приложении ASP.NET используется еще один способ получения WindowsIdentity из имени пользователя / пароля: LogonUserA импортировано из advapi32.dll.

Maybefinalupdate
После вашего последнего обновления я вижу яснее.Вы абсолютно правы с вашим вопросом.Насколько я знаю, изменение (или влияние на) того, что возвращает WindowsPrincipal.GetCurrent, возможно только путем активации проверки подлинности Windows и отключения анонимного доступа в IIS.Что вы не можете сделать.

Но подождите!

Ого, это становится грязным.Но когда я увидел тэг "kludge" в вашем вопросе, я осмелюсь написать следующее ... Но будьте осторожны: я почти уверен, что это , а не , что Microsoft показала в этой демонстрации, которую вы упомянули :) Ни то, ни другоелюбые нежелательные побочные эффекты!

То, что вы должны быть в состоянии сделать (мой быстрый и грязный тест показал, что оно работает), это

  1. Добавить поле System.Security.Principal.WindowsImpersonationContext в Global.asax
  2. В Global.asax с Application_AuthenticateRequest получите WindowsIdentity для пользователя, которого вы хотите выдать себя за другого (вы, кажется, можете сделать это, поскольку вы можете выдать себя за пользователя в коде)
  3. Все еще в Global.asax s Application_AuthenticateRequest выдавать себя за пользователя (в коде, как вы делали ранее или как описано в статье (статьях), приведенной выше; например, здесь ), не вызовimpersonationContext.Undo() ...
  4. В Global.asax с Application_EndRequest вызов impersonationContext.Undo() на поле, которое вы создали за два шага до
  5. Сохранить <identity impersonate="true" /> в Web.config
  6. Крест все пальцы рук и ног:)

Правда, вы бы тогда все равно выдавали себя за пользователя в коде (т. Е. "Загромождали свой код имперсами").onation "), но только слегка :) Имеется в виду только в одном месте (Global.asax).

Что вы считаете?

@ Rising Star: кстати: в вашем комментарии от 2010-05-31 14:03:31Z вы пишете «Он говорит, что вы можете снять флажок , а затем ...».Это намеренно или вы хотели написать «чек»?Потому что, если вы снимите флажок в этом поле, вы должны проверить что-то еще, чтобы разрешить доступ кому-либо еще.Что бы вы (или он) проверили вместо этого?Аутентификация по формам (поскольку здесь нет «аутентификации по волшебной флейте», как вы правильно отметили здесь :))?Извините, я (автоматически) до сих пор неверно истолковываю его как "чек" ...

Обновление (от Rising Star) Я вижу, вы преобразовали эту ветку в вики сообщества, поэтому я больше неприходится вручную обновлять вопрос.Это будет беспорядок, но как только проблема будет решена, мы можем немного ее исправить.

scherand спросил, как мне прикрепить Windows Identity к cookie.Это делается с использованием инфраструктуры WIF;в частности, я делаю это, возвращая WindowsClaimsPrincipal из ClaimsAuthenticationManager, как описано в предоставленной мною ссылке "наименьшие привилегии".Кроме того, да, босс сказал снять флажок поле «анонимный доступ» в настройках IIS;кажется, это все ломает.

Я думаю, вы можете быть на правильном пути со своим ответом.Я просто пытался сделать свой собственный код в global.asax сам.

0 голосов
/ 28 мая 2010

В какой-то момент вам придется запрашивать учетные данные у пользователей - это может быть разовый запрос (или пока пользователь не изменит свой пароль в любом случае).

Звучит так, как будто вы пытаетесь выполнить однократную регистрацию - хотя обычно это происходит наоборот (позволяет использовать учетную запись Windows для передачи учетных данных, отличных от учетной записи Windows, в другие приложения), но нет никаких причин, по которым вы не можете сделать следующее:

  1. пользователь входит в приложение как обычно
  2. если у пользователя нет сохраненных учетных данных Windows
    1. запросить учетные данные у пользователя
  3. попробуйте войти как пользователь
  4. при неудачном входе
    1. снова попросить пользователя ввести учетные данные
  5. учетные данные магазина

Когда у вас есть учетные данные, хранящиеся в вашем кэше "SSO", вы можете использовать их для создания новых объектов NetworkCredential для ваших сетевых запросов (т. Е. Ваших соединений SQL, копий файлов и т. Д.).

Вы можете прочитать описание здесь http://aspalliance.com/1545_understanding_single_signon_in_aspnet_20.all

0 голосов
/ 28 мая 2010

Вы проверили добавление олицетворения в web.config? Таким образом, ваш процесс не запускается как анонимный пользователь, а работает как аутентифицированная сетевая учетная запись:

<identity impersonate="true" userName="domain\username" password="goes@here"/>

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

Похоже, вы пытаетесь использовать БД для ограничения доступа к функциональности. Я не уверен, что это лучший путь. Обычно приложение имеет полный доступ к БД, а затем вы ограничиваете доступ с помощью кода.

UPDATE: Согласно вашему комментарию, похоже, что предыдущий абзац уместен. Я никогда не слышал об архитектуре, в которой платформа ASP.NET обрабатывает олицетворение для каждого зарегистрированного пользователя. Я видел системы, в которых пользователь проходил аутентификацию через базовую сетевую структуру - он же аутентификацию kerberos, выполняемую IIS / Windows.

Как и прежде, традиционно у каждого конечного пользователя нет уникальных прав на сервере БД. Приложение имеет логин для базы данных, а затем отдельные пользователи управляются через приложение.

Есть ли причина, по которой вы не используете kerberos и не переносите рабочую нагрузку на IIS?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...