Как защитить паролем маршрут MVC с IIS - PullRequest
0 голосов
/ 21 апреля 2020

Я хочу защитить паролем один из маршрутов моего приложения MVC 5. Я не хочу go через процесс проверки подлинности форм или [Authorize] et c. Я просто хочу развернуть приложение как обычно и использовать IIS для защиты одного из маршрутов.

например, mydomain.com/ открыто для мира

mydomain.com/Folder1 pwd protected

Использование IIS для защиты физической папки pwd быстро и просто, но если я создаю виртуальный каталог или приложение, соответствующее этому маршруту mvc, я получаю 403 запрета, потому что он думает, что я пытаюсь перечислить содержимое каталога и там очевидно, не является файлом по умолчанию, поскольку папка является виртуальной.

Если виртуальный каталог / приложение - это путь к go, куда я могу указать его?

1 Ответ

0 голосов
/ 22 апреля 2020

Следующее не является решением, которое я искал. Я хотел реализацию, отличную от progammati c, которую можно добавлять / удалять / изменять без необходимости какого-либо кодирования или развертывания (например, в IIS). Причина, по которой я решил использовать его, заключается в том, насколько просто и быстро это было реализовано. Внедрение заняло гораздо меньше времени, чем я потратил на поиск и проверку решений IIS.

Очевидно, что это не подходит для обеспечения безопасности в большинстве приложений, но для простоты реализации подходит для моего сценария. очень хорошо

Это базовая аутентификация c с использованием пользовательского ActionFilter и атрибута на контроллере.

Сначала создайте свой 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 BasicAuthenticationAttribute()
    {
        this.Username = ConfigurationManager.AppSettings["UserName"];
        this.Password = ConfigurationManager.AppSettings["Password"];
        this.BasicRealm = ConfigurationManager.AppSettings["BasicRealm"];
    }

    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 ?? ""));
        filterContext.Result = new HttpUnauthorizedResult();
    }
}

Затем добавьте атрибут контроллера, который вы хотите защитить:

[BasicAuthentication()]

или этот, если по какой-то причине вы хотите жестко указать свое имя пользователя и пароль

[BasicAuthentication("username", "password", BasicRealm = "your-realm")]

И это все. Просто добавьте учетные данные в ваш web.config и создайте пользовательскую страницу ошибки 401, если хотите.

Полагаю, также достаточно легко добавить еще один ключ web.config, который будет действовать как флаг для активации и деактивации аутентификации. если вы хотите иметь возможность отключить его без повторного развертывания приложения

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...