Пользовательская аутентификация и ASP.NET MVC

27

У меня есть встроенное веб-приложение, встроенное в ASP.NET 4. Мы застряли в использовании API аутентификации, созданного другой командой. Если пользователь сайта успешно прошел аутентификацию для сайта, я хотел бы предоставить им доступ ко всему сайту.

В ASP.NET дни WebForm я просто использовал для сохранения пользовательского объекта User в сеансе. Если этот объект был пустым, я знал, что пользователь не прошел проверку подлинности. Есть ли подобный, но улучшенный метод для этого в MVC. Я не хочу, если возможно, создавать собственный поставщик модели членства ASP.NET. Каков самый простой способ сделать это?

  • 1
    Разве вы не можете просто установить билет аутентификации вручную после вызова вашего старого API?
  • 1
    Если установлен FormsAuthenticationTicket , вы можете использовать Request.IsAuthenticated и User.Identity чтобы определить, вошел ли пользователь в систему. Также будет работать атрибут Authorize .
Показать ещё 5 комментариев
Теги:
asp.net-mvc
asp.net-mvc-4

5 ответов

42

Вы можете использовать Forms Authentication в сочетании с Authorize следующим образом:

Чтобы ограничить доступ к представлению:

Добавьте атрибут AuthorizeAttribute в объявление метода действия, как показано ниже,

[Authorize]
public ActionResult Index()
{
    return View();
}

Настройка проверки подлинности форм в web.config

<authentication mode="Forms">
     <forms loginUrl="~/Account/Login" timeout="2880" />
</authentication>

Вход в систему Действие: Установите файл cookie аутентификации, если он действителен.

[HttpPost]
public ActionResult Login(User model, string returnUrl)
{
        //Validation code

        if (userValid)
        {
             FormsAuthentication.SetAuthCookie(username, false);
        }
}

Выход из системы Действие:

public ActionResult LogOff()
{
    FormsAuthentication.SignOut();
    return RedirectToAction("Index", "Home");
}
  • 0
    Нужно ли указывать [Authorize] для каждого метода Controller во всем приложении? Я только хочу открыть два метода контроллера для анонимных пользователей (~ / Account / Login GET и POST). Кажется, должен быть лучший способ. Требуется ли для этого фильтр? пользовательский атрибут? Спасибо за вашу помощь. +1
  • 3
    В этом случае посмотрите здесь blogs.msdn.com/b/rickandy/archive/2011/05/02/…
Показать ещё 1 комментарий
5

Вероятно, вы захотите создать настраиваемый фильтр авторизации. Вот пример: Пользовательские фильтры в MVC. Вы можете применить этот фильтр по всему миру в начале приложения (используя RegisterGlobalFilters).

public class LegacyAuthorize : AuthorizeAttribute
{
  public override void OnAuthorization(HttpActionContext actionContext)
  {
    if (HttpContext.Current.Session["User"] == null)
      base.HandleUnauthorizedRequest(actionContext);
  }
}

Тогда в вашем global.asax у вас будет что-то вроде этого:

GlobalFilters.Filters.Add(new LegacyAuthorize());
  • 0
    Переопределение атрибута Authorize может быть опасным, особенно если проверяется только сеанс. Идентификатор сеанса не создается повторно, что может привести к перехвату сеанса через XSS и т. Д. Blog.securityps.com/2013/06/… и support.microsoft.com/en-us/kb/899918
3

Вы можете попробовать что-то вроде этого:

FormsAuthentication.SetAuthCookie(username, rememberMe);

чтобы установить cookie для аутентифицированного пользователя, просто используйте атрибут [Authorize] на контроллере или действии, которые нуждаются в аутентификации.

Попробуйте искать по этой теме для получения дополнительной информации, вы найдете много информации об аутентификации и авторизации в MVC.

1

Все, что вы можете сделать в формах, которые вы можете сделать в MVC, просто установите переменную сеанса в действии входа в контроллер.

Или вы можете сделать это:   В действии входа добавьте formsauthentication.setauthcookie("username")

После этого любое действие с ключевым словом [Authorize] позволит текущему пользователю.

-3

Вы можете выполнить Аутентификацию сеанса, просто поместив значение переменной сеанса, когда логин будет успешным. Например,

public ActionResult Index(Models.Login login)
    {
        if (ModelState.IsValid)
        {
            Dal.Login dLogin = new Dal.Login();
            string result = dLogin.LoginUser(login);
            if (result == "Success")
                Session["AuthState"] = "Authenticated";
        }
        return View();
    }

Теперь трюк заключается в том, что у вас должна быть общая страница макета всех просмотров, на которые вы должны проверить наличие подлинности. И на этой странице макета просто проверяйте бритву таким образом -

<body>
    @if (Session["AuthState"] != "Authenticated")
    {
        Response.Redirect("~/login");
    }
    // other html
</body>

Я использую этот метод в панели администрирования приложения.

  • 0
    Просто предупреждаю, что этот метод опасен и может привести к фиксации сеанса или атаке перехвата сеанса. Идентификатор сеанса никогда не обновляется. Смотрите эту статью для быстрого объяснения недостатков. ТЛ; др; вам нужен куки-файл аутентификации, который является уникальным для авторизованного сеанса и идеально привязан к сеансу. blog.securityps.com/2013/06/...

Ещё вопросы

Сообщество Overcoder
Наверх
Меню