2013-09-03 6 views
27

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

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

+1

Можете ли вы не просто установить билет для проверки подлинности вручную после вашего вызова унаследованного API? – TheKingDave

+1

Если установлен 'FormsAuthenticationTicket', вы можете использовать' Request.IsAuthenticated' и 'User.Identity', чтобы определить, вошел ли пользователь в систему. Также будет работать атрибут' Authorize'. –

+3

FYI, обработка аутентификации в сеансе - очень плохая идея, она небезопасна (cookie не зашифрован и легко украден) и подвержен сбою, поскольку сеанс может быть переработан в любое время. Вместо этого используйте FormsAuthentication –

ответ

5

Возможно, вы захотите иметь заказ authorization filter. Вот пример: Custom filters in 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 и т. Д. Http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html и https://support.microsoft. com/en-us/kb/899918 – PJH

1

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

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

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

3

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

FormsAuthentication.SetAuthCookie(username, rememberMe); 

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

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

42

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

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

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

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

Конфигурирование аутентификации форм в web.config

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

Войти Сообщение Действие: Set Authentication печенье, если пользователь является действительным

[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

Должен ли я поставить [Авторизовать] на каждый метод контроллера во всем моем приложении? Я хочу только открыть два метода контроллера анонимным пользователям (~/Account/Login GET и POST). Похоже, что должен быть лучший способ. Для этого требуется фильтр? пользовательский атрибут? Спасибо за вашу помощь. +1 – BuddyJoe

+3

В этом случае посмотрите здесь http://blogs.msdn.com/b/rickandy/archive/2011/05/02/securing-your-asp-net-mvc-3-application.aspx –

+0

Почему Новая идентификация ASP должна быть такой же простой, как «FormsAuthentication»? https://www.asp.net/identity –

-2

Вы можете сделать проверку подлинности сеанса, просто помещая значение переменной сеанса, когда Логин является успешный.Например

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

Просто голова, что этот метод опасен и может привести к фиксации сеанса или атаке захвата сеанса. Идентификатор сеанса никогда не обновляется. См. Эту статью для быстрого объяснения недостатков. tl; dr; вам нужен файл cookie для проверки подлинности, который уникален для входа в систему и идеально привязан к сеансу. http://blog.securityps.com/2013/06/session-fixation-forms-authentication.html – PJH

Смежные вопросы