Я использовал следующий код для реализации фильтра базовой проверки подлинности в моем приложении 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();
}
}
Вы подтвердили, что клиент определенно получает статус 401. Есть эта «вещь», которую я не могу вспомнить с головы, когда, если некоторые клиенты не получат 401, они не отправят заголовок Auth. – rism
Да, клиент получает код статуса 401. Я сомневаюсь в том, что в IIS включена форма и базовая аутентификация, и я определенно нуждаюсь в проверке подлинности. – mhesabi
Хорошо, я удивлен. И последний ответ - 401. Вы не получаете 401, а затем ошибку Server 500, таким образом, потенциально отменяя сигнал 401 клиенту. – rism