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

Я занимаюсь рефакторингом работающего веб-приложения ASP.NET для предоставления интерфейса веб-служб с помощью веб-службы ASP.NET. В соответствии с рекомендациями по аутентификации веб-сервисов, Basic Auth over https - это путь. Давайте предположим, что в отличие от WS-Security, X509 и т. Д.

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

Я пишу свой собственный HttpModule или это можно сделать проще?

3 ответа

Решение

Вероятно, стоит использовать обычную базовую аутентификацию для IIS, написанную Домиником Байером. Как он указывает, имена пользователей WCF 3.5 для обеспечения безопасности транспорта нельзя использовать в службах, размещенных на IIS, хотя мой вопрос касался веб-служб ASP.NET, а не WCF.

Есть еще одна реализация HTTP-модуля под названием " Обычная аутентификация" в ASP.NET по отношению к пользовательскому источнику данных от Santosh Sahoo.

Хотя это не то, что я хотел, я нашел образец SOAP-заголовков QuickStart Tutorial как информативный обходной путь. Отправка пароля в виде обычного текста через http явно небезопасна, но этот пример можно расширить, чтобы повысить безопасность, например, при работе по протоколу https или при отправке хэша "пароль + одноразовый идентификатор GUID + метка времени".

Возьмите ценность Authorization заголовок, проанализируйте его и подтвердите имя пользователя / пароль.

Значением является имя пользователя: пароль, закодированный в виде строки Base64.

См. http://en.wikipedia.org/wiki/Basic_access_authentication для подробностей.

Изменить: если вы хотите, чтобы это было сделано для каждого запроса, используя пользовательскую схему аутентификации, то было бы проще написать HttpModule для обработки разбора заголовка и установки принципала потока.

Если вы рассматриваете WCF, вы можете использовать usernameOverTransport security для basicHttpBinding. то есть имя пользователя и пароль находятся в заголовке 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;
}
Другие вопросы по тегам