2015-03-04 2 views
1

Я использовал следующий код для реализации фильтра базовой проверки подлинности в моем приложении ASP.Net MVC. все работает хорошо на локальной машине, пока оно не работает на рабочем сервере, и оно продолжает запрашивать окно входа, потому что Request.Headers["Authorization"] имеет значение null.
Я использовал fiddler, чтобы получить заголовки для этого запроса, и заголовок Authorization был там с ожидаемыми значениями. Я понятия не имею, почему Request.Headers["Authorization"] всегда null: |
Я также создал новый проект только с этим фильтром и одним контроллером и опубликован на сервере, угадайте, что!? он работает ...
Отсутствует заголовок авторизации в базовой аутентификации

public class RequireBasicAuthenticationAttribute : ActionFilterAttribute 
{ 
    public string BasicRealm { get; set; } 
    protected string Username { get; set; } 
    protected string Password { get; set; } 

    public RequireBasicAuthenticationAttribute() 
    { 
     this.Username = System.Configuration.ConfigurationManager.AppSettings["ProtectedUsername"]; 
     this.Password = System.Configuration.ConfigurationManager.AppSettings["ProtectedPassword"]; 
    } 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     var req = filterContext.HttpContext.Request; 
     var auth = req.Headers["Authorization"]; 
     auth.LogText(); 
     if (!string.IsNullOrEmpty(auth)) 
     { 
      var cred = System.Text.ASCIIEncoding.ASCII.GetString(Convert.FromBase64String(auth.Substring(6))).Split(':'); 
      var user = new { Name = cred[0], Pass = cred[1] }; 
      if (Username.Equals(user.Name, StringComparison.InvariantCultureIgnoreCase) && Password.Equals(user.Pass)) return; 
     } 
     var res = filterContext.HttpContext.Response; 
     res.StatusCode = 401; 
     res.AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", BasicRealm ?? "bimeh-takmili")); 
     res.End(); 
    } 
} 
+0

Вы подтвердили, что клиент определенно получает статус 401. Есть эта «вещь», которую я не могу вспомнить с головы, когда, если некоторые клиенты не получат 401, они не отправят заголовок Auth. – rism

+0

Да, клиент получает код статуса 401. Я сомневаюсь в том, что в IIS включена форма и базовая аутентификация, и я определенно нуждаюсь в проверке подлинности. – mhesabi

+0

Хорошо, я удивлен. И последний ответ - 401. Вы не получаете 401, а затем ошибку Server 500, таким образом, потенциально отменяя сигнал 401 клиенту. – rism

ответ

0

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

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

public override void ExecuteResult(ControllerContext context) 
    { 
     if (context == null) throw new ArgumentNullException("context"); 

     // this is really the key to bringing up the basic authentication login prompt. 
     // this header is what tells the client we need basic authentication 
     var res = context.HttpContext.Response; 
     res.StatusCode = 401; 
     res.AddHeader("WWW-Authenticate", "Basic"); 
     res.End(); 
     base.ExecuteResult(context); 
    } 

Вы не можете это сделать, то код выдаст ошибку:

Server cannot set status after HTTP headers have been sent.

И так как он бросает ошибку (я думаю), и будучи отскочил вокруг, он не может быть выведен ответом 401 статуса , Заголовок «WWW-Authenticate» все еще отправляется, поэтому вы получаете диалог.

Диалоговое окно учетных данных открывается, когда обнаружен «WWW-аутентификация», но он отправит обратно обратно заголовок Authorization в запрос, если он получил статус 401 от последнего ответа.

Так что, если вы уроните:

base.ExecuteResult(context); 

из вашего кода, что происходит?

Edit:

На самом деле падение

res.End(); 

будет путь. Duh.

+0

Я обновил свой вопрос – mhesabi

Смежные вопросы