Пользовательская базовая аутентификация HTTP для ASP.NET веб-сервисах на .NET 3.5/VS 2008

Я рефакторинг рабочего ASP.NET веб-приложения для разоблачения веб-интерфейса служб с помощью ASP.NET веб-службы. По словам Web Services authentication - best practices, Basic Auth over https is the way to go. Let's assume it is, as opposed to doing WS-Security, X509, etc.. , Основные Auth над https это путь. Предположим, что это, в отличие от делать WS-безопасности, X509 и т.д.

На .NET 3.5/VS 2008, что самый простой способ реализации пользовательских http Базовая аутентификация (не-Windows учетная запись), например, принимая только если имя пользователя "foo" и пароль "бар". В конечном счете, я хотел бы Thread.CurrentPrincipal set. набор.

Должен ли я написать свой собственный HttpModule or can this be done simpler? или это может быть сделано проще?

Ответ на: "Пользовательская базовая аутентификация HTTP для ASP.NET веб-сервисах на .NET 3.5/VS 2008"

Количество ответов:3

Если вы рассматриваете WCF, вы можете использовать usernameOverTransport безопасности для basicHttpBinding. т.е. имя пользователя и passowrd находятся в заголовке запроса SOAP, и весь трафик защищен шифрованием SSL по проводу.

Пользовательский Валидатор UserNamePasswordValidator может быть использован для проверки подлинности входящих учетных данных в отношении, например, базы данных.

Вы можете установить основной поток в пользовательском IAuthorizationPolicy в поведении службы.

, например, Оценка реализации метода для IAuthorizationPolicy для определения текущего принципа

public bool Evaluate(EvaluationContext evaluationContext, ref object state)
{
       Object obj;
       if( evaluationContext.Properties.TryGetValue( "Identities", out obj ))
       {
            // get the authenticated identity
            IIdentity client = (obj as IList<IIdentity>)[0];
            evaluationContext.Properties["Principal"] = ... // create principal obj here for the identity
            // this will set thread's current principal
       }
       return true;
}

Захватите значение заголовка "-24",, разберите его и подтвердите имя пользователя/пароль. Значением является имя пользователя: пароль, закодированный как строка Base64. Подробности смотрите в материале

см. http://en.wikipedia.org/wiki/Basic_access_authentication for details.

Редактировать : если вы хотите, чтобы это сделано для каждого запроса, используя пользовательские auth схеме, то было бы легче написать HttpModule to handle parsing the header and setting the thread's principal. для обработки разбора заголовка и настройки основной поток.

Скорее всего, используя Custom Basic Authentication for IIS, written by , написанный Dominick Baier is the way to go. является путь. Имена пользователей WCF 3.5, связанные с транспортной безопасностью, не могут использоваться на сервисе, организованном IIS, хотя мой вопрос был относительно ASP.NET Web Services, а не WCF.

Есть еще одна реализация модуля HTTP называется Basic authentication in ASP.NET against custom datasource by по Santosh Sahoo. .

Хотя это не то, что я хотел, я нашел QuickStart Tutorial's SOAP Headers sample to be informative workaround. Sending password in plain text over http is clearly insecure, but this example could be extended to add more security, for instance running on https or sending hash of "password + one-time GUID + timestamp". быть информативным обходным путем. Отправка пароля в простом тексте через http явно небезопасно, но этот пример может быть расширен, чтобы добавить больше безопасности, например, работает на https или отправки хэша "пароль и одноразовый GUID и timestamp".