Как реализовать базовую HTTP-аутентификацию на сервере отладки VS? - PullRequest
3 голосов
/ 10 января 2012

Я делаю тестовую установку для элемента управления ActiveX HTTP, и мне нужно создать веб-сайт для безопасного POST.Для простоты я запускаю веб-приложение с сервером отладки VS;Проект веб-приложения является частью решения с тестовым приложением.Проверка подлинности NTLM не поддерживается элементом управления AX.Есть ли простой способ требовать очень простой http-аутентификации без NTLM или перенаправления на страницу?Мне просто нужно, чтобы требовать имя пользователя и пароль во время поста.Содержимое имени пользователя и пароля не имеет значения, поэтому все будет храниться в виде открытого текста.

Я пробовал режим аутентификации в Web.Config;Windows выглядит идентично NTLM (там может быть неправильно), Forms требуется форма для подключения и установки файла cookie, Passport выходит за рамки этого проекта, и я не знаю, как бы я реализовал None.Любые идеи?

Я попробовал "authentication mode =" Windows "" в Web.Config и установил флажок NTLM на вкладке "Web" веб-приложения.

Ответы [ 2 ]

6 голосов
/ 11 января 2012

Вы можете реализовать свою собственную базовую HTTP-аутентификацию, используя ASP.NET.Это не выглядит как очень сложная спецификация, но подробности смотрите в RFC1945 .

Если бы мне пришлось это сделать, я бы начал сHttpModule, который запускается при каждом запросе и проверяет заголовок HTTP HTTP_AUTHORIZATION.Если это заголовок для базовой аутентификации, то вы можете декодировать имя пользователя и пароль.Если заголовок отсутствует или имя пользователя и пароль неверны, вы отправляете ответ HTTP 401 и добавляете заголовок WWW-Authenticate.

Примерно так (не проверено, но вы поняли идею):

public class BasicAuthenticationModule: IHttpModule
{
  public void Init(HttpApplication application)
  {
    application.AuthenticateRequest += new EventHandler(Do_Authentication);
  }

  private void Do_Authentication(object sender, EventArgs e)
  {
    var request = HttpContext.Current.Request;
    string header = request.Headers["HTTP_AUTHORIZATION"];
    if(header != null && header.StartsWith("Basic "))
    {
      // Header is good, let's check username and password
      string username = DecodeFromHeader(header, "username");
      string password = DecodeFromHeader(header, password);

      if(Validate(username, password) 
      {
        // Create a custom IPrincipal object to carry the user's identity
        HttpContext.Current.User = new BasicPrincipal(username);
      }
      else
      {
        Protect();
      }
    }
    else
    {
      Protect();
    }
  }

  private void Protect()
  {
    response.StatusCode = 401;
    response.Headers.Add("WWW-Authenticate", "Basic realm=\"Test\"");
    response.Write("You must authenticate");
    response.End();
  }

  private void DecodeFromHeader()
  {
    // Figure this out based on spec
    // It's basically base 64 decode and split on the :
    throw new NotImplementedException();
  }

  private bool Validate(string username, string password)
  {
    return (username == "foo" && pasword == "bar");
  }

  public void Dispose() {}

  public class BasicPrincipal : IPrincipal
  {
    // Implement simple class to hold the user's identity
  }
}
2 голосов
/ 12 января 2012

michielvoo ответ велик, но для простоты я пошел с этим в коде для страницы:

string authorization = Request.Headers["Authorization"];
string userInfo;
string username = "";
string password = "";
if (authorization != null)
{
     byte[] tempConverted = Convert.FromBase64String(authorization.Replace("Basic ", "").Trim());
     userInfo = System.Text.Encoding.UTF8.GetString(tempConverted);
     string[] usernamePassword = userInfo.Split(new string[] { ":" }, StringSplitOptions.RemoveEmptyEntries);
     username = usernamePassword[0];
     password = usernamePassword[1];
}

if (username == "yourusername" && password == "yourpassword")
{
}
else
{
     Response.AddHeader("WWW-Authenticate", "Basic realm=\"Test\"");
     Response.StatusCode = 401;
     Response.End();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...