Подтвердить что ты не робот

Обычная проверка подлинности в ASP.NET MVC 5

Какие шаги необходимо предпринять для реализации базовой аутентификации в ASP.NET MVC 5?

Я читал, что OWIN не поддерживает аутентификацию cookieless, поэтому возможна обычная аутентификация?

Нужен ли мне специальный атрибут? Я не уверен, как работают эти атрибуты.

4b9b3361

Ответ 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>

В противном случае приложение использует проверку подлинности форм. Окно проверки подлинности браузера появилось, когда в противном случае использовалась обычная проверка подлинности.