Обычная проверка подлинности в ASP.NET MVC 5
Какие шаги необходимо предпринять для реализации базовой аутентификации в ASP.NET MVC 5?
Я читал, что OWIN не поддерживает аутентификацию cookieless, поэтому возможна обычная аутентификация?
Нужен ли мне специальный атрибут? Я не уверен, как работают эти атрибуты.
Ответы
Ответ 1
Вы можете использовать этот простой, но эффективный механизм, используя собственный атрибут ActionFilter:
public class BasicAuthenticationAttribute : ActionFilterAttribute
{
public string BasicRealm { get; set; }
protected string Username { get; set; }
protected string Password { get; set; }
public BasicAuthenticationAttribute(string username, string password)
{
this.Username = username;
this.Password = password;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var req = filterContext.HttpContext.Request;
var auth = req.Headers["Authorization"];
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 (user.Name == Username && user.Pass == Password) return;
}
filterContext.HttpContext.Response.AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", BasicRealm ?? "Ryadel"));
/// thanks to eismanpat for this line: http://www.ryadel.com/en/http-basic-authentication-asp-net-mvc-using-custom-actionfilter/#comment-2507605761
filterContext.Result = new HttpUnauthorizedResult();
}
}
Его можно использовать для установки под базовой аутентификацией всего контроллера:
[BasicAuthenticationAttribute("your-username", "your-password",
BasicRealm = "your-realm")]
public class HomeController : BaseController
{
...
}
или конкретный ActionResult:
public class HomeController : BaseController
{
[BasicAuthenticationAttribute("your-username", "your-password",
BasicRealm = "your-realm")]
public ActionResult Index()
{
...
}
}
Вы также можете прочитать для получения дополнительной информации.
Ответ 2
Вы можете сделать это с помощью настраиваемого атрибута. Существует реализация настраиваемого атрибута, который поддерживает базовую аутентификацию в проекте с открытым исходным кодом SimpleSecurity, который вы можете скачать здесь. Существует справочное приложение, демонстрирующее, как оно используется. Он был первоначально разработан для работы с SimpleMembership в MVC 4 и недавно был портирован для использования ASP.NET Identity в MVC 5.
Ответ 3
Я хотел внести поправки в ответ, разделяемый Darkseal, потому что этот код имеет серьезный недостаток безопасности. Как написано, этот фильтр действий фактически не завершает запрос при вызове res.End(). Пользователю будут предложены учетные данные, и ответ 401 будет возвращен, если учетные данные не совпадут, но действие контроллера по-прежнему выполняется на стороне сервера. Вам нужно установить свойство filterContext.Result для чего-то, чтобы запрос прекратился правильно и не продолжал действие метода действия.
Это было особенно плохо для моей ситуации, поскольку я пытался защитить конечную точку веб-сервиса, которая получает фид данных от третьего лица. Как написано, этот фильтр действий не защищал ничего, потому что данные все еще были нажаты через мой метод действий.
Мое "быстрое исправление" ниже:
public class BasicAuthenticationAttribute : ActionFilterAttribute
{
public string BasicRealm { get; set; }
protected string Username { get; set; }
protected string Password { get; set; }
public BasicAuthenticationAttribute(string username, string password)
{
this.Username = username;
this.Password = password;
}
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var req = filterContext.HttpContext.Request;
var auth = req.Headers["Authorization"];
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 (user.Name == Username && user.Pass == Password) return;
}
var res = filterContext.HttpContext.Response;
res.AddHeader("WWW-Authenticate", String.Format("Basic realm=\"{0}\"", BasicRealm ?? "Ryadel"));
filterContext.Result = new HttpUnauthorizedResult();
}
}
Ответ 4
Для базовой аутентификации HTTP не требуется cookie. Он основан на HEADER в HTTP-запросе. Заголовок называется "Авторизация", а его значение должно быть именем пользователя и паролем, объединенным в строку "имя пользователя: пароль" (все кодировки base64).
С уважением, я никогда не использовал базовую аутентификацию с ASP.NET MVC, но я использовал Web API для создания настраиваемого атрибута (вы можете начать с здесь для WebAPI или здесь для MVC).
Ответ 5
вы можете попробовать этот пакет на Nuget (AuthPackage)
он позволяет легко добавлять аутентификацию в ваш asp.net mvc.
-
установить пакет с помощью консоли диспетчера пакетов:
Install-Package AuthPackage
-
добавить строку подключения к вашему Web.config в (appSettings):
<add key="connectionString" value="connectionStringHere" />
-
вы готовы зарегистрировать пользователей, войти в систему, выйти из системы
Пример:
public async Task<ActionResult> SignIn()
{
var context = System.Web.HttpContext.Current;
AuthUser authUser = new AuthUser(context);
await authUser.SignIn("[email protected]", "123456");
return RedirectToAction("Index", "Home");
}
Вы можете прочитать Документацию здесь
Ответ 6
Приложение нашей "случайно" использовало базовую аутентификацию из-за следующего кода в Web.config:
<system.webServer>
<modules>
<remove name="FormsAuthentication" />
</modules>
... other stuff
</system.webServer>
В противном случае приложение использует проверку подлинности форм.
Окно проверки подлинности браузера появилось, когда в противном случае использовалась обычная проверка подлинности.