Пользовательская базовая проверка подлинности 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;
}