2015-05-21 4 views
3

Итак, мои требования к проекту изменились, и теперь я думаю, что мне нужно создать собственный фильтр действий.Авторизация с переменными сеанса в asp net mvc 5

Итак, это мой текущий контроллер Логин:

public class LoginController : Controller 
{ 
    // GET: Login 
    public ActionResult Index() 
    { 
     return View(); 
    } 

    [HttpPost] 
    [AllowAnonymous] 
    [ValidateAntiForgeryToken] 

    public ActionResult Login(LoginViewModel model) 
    { 
     string userName = AuthenticateUser(model.UserName, model.Password); 
     if (!(String.IsNullOrEmpty(userName))) 
     { 
      Session["UserName"] = userName; 
      return View("~/Views/Home/Default.cshtml"); 
     } 

     else 
     { 
      ModelState.AddModelError("", "Invalid Login"); 
      return View("~/Views/Home/Login.cshtml"); 
     } 
    } 

    public string AuthenticateUser(string username, string password) 
    { 
     if(password.Equals("123") 
      return "Super" 
     else 
      return null; 
    } 

    public ActionResult LogOff() 
    { 
     Session["UserName"] = null; 
     //AuthenticationManager.SignOut(); 
     return View("~/Views/Home/Login.cshtml"); 
    } 
} 

И это мое действие фильтра попытка:

public class AuthorizationFilter : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (HttpContext.Current.Session["UserName"] != null) 
     { 
      filterContext.Result = new RedirectToRouteResult(
        new RouteValueDictionary{{ "controller", "MainPage" }, 
             { "action", "Default" } 

            }); 
     } 
     base.OnActionExecuting(filterContext); 
    } 
} 

Я уже добавил его FilterConfig, но когда я войти в него не load Default.cshtml он просто продолжает цикл фильтра действий. В результате действия на него выглядит следующим образом:

// это находится в контроллере MainPage

[AuthorizationFilter] 
    public ActionResult Default() 
    { 
     return View("~/Views/Home/Default.cshtml"); 
    } 

Итак, что мне нужно добавить, чтобы дать разрешение на это только идентифицированные пользователи могут просматривать приложения Страниц? Должен ли я использовать переменные сеанса или есть другой/лучший способ сделать это с помощью? Я довольно сильно застрял в AuthenticateUser(), так как сейчас происходит просто сравнение, подобное тому, которое мы имеем сейчас.

Спасибо за ваше время.

+0

Чтобы уточнить, вы добавили свой 'AuthorizationFilter' в FilterConfig? –

+0

@WillSmith да, я добавил его в FilterConfig – jiggergargle

+0

Почему вы не можете использовать встроенный атрибут '[Authorize]' на вашем контроллере? – Luke

ответ

6

создать AuthorizeAttribute с вашей логикой там:

public class AuthorizationFilter : AuthorizeAttribute, IAuthorizationFilter 
{ 
    public void OnAuthorization(AuthorizationContext filterContext) 
    { 
     if (filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) 
      || filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true)) 
     { 
      // Don't check for authorization as AllowAnonymous filter is applied to the action or controller 
      return; 
     } 

     // Check for authorization 
     if (HttpContext.Current.Session["UserName"] == null) 
     { 
      filterContext.Result = new HttpUnauthorizedResult(); 
     } 
    } 
} 

До тех пор, пока у вас есть URL-адрес входа, настроенный в вашем файле Startup.Auth.cs, он будет обрабатывать перенаправление на страницу входа для вас. Если вы создаете новый проект MVC это настроит это для вас:

public partial class Startup 
{ 
    public void ConfigureAuth(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(
      new CookieAuthenticationOptions { 

        // YOUR LOGIN PATH 
        LoginPath = new PathString("/Account/Login") 
      } 
     ); 
    } 
} 

С помощью этого вы можете украсить ваши контроллеры с [AuthorizationFilter], а также [AllowAnonymous] атрибутами, если вы хотите, чтобы предотвратить разрешение от проверки на некоторые контроллеры или действия.

Возможно, вы захотите проверить это в разных сценариях, чтобы обеспечить ему достаточно надежную защиту. ASP.NET MVC предоставляет механизмы, которые вы можете использовать из коробки для защиты ваших приложений, я бы рекомендовал использовать их, если это возможно, в любой ситуации. Я помню, как кто-то сказал мне, если вы пытаетесь сделать аутентификацию/безопасность для себя, вы, вероятно, ошибаетесь.

+0

Я провел некоторое исследование, и кажется, что переопределение onAuthorization - плохая идея, потому что он делает некоторые специальные вещи, чтобы избежать кэшей от обслуживания страниц. – Worthy7

+0

Спасибо, что сообщили мне. Мне было бы интересно узнать подробности об этом, есть ли у вас ссылка? – Luke

+0

Я прочитал исходный код, в нем есть большое важное уведомление об этом. https://github.com/ASP-NET-MVC/aspnetwebstack/blob/master/src/System.Web.Mvc/AuthorizeAttribute.cs – Worthy7

1

Поскольку ваш атрибут добавлен в FilterConfig, он будет применяться ко всем действиям. Поэтому, когда вы переходите к своему действию MainPage/Default, он будет применять фильтр и перенаправлять вас на действие MainPage/Default (и так далее ...).

Вам нужно будет либо:

  • удалить его из FilterConfig и применить его к соответствующим действиям/контроллеры
  • или добавить дополнительную проверку в фильтре так, чтобы он не перенаправляет на некоторых маршруты
+0

спасибо за ответы, я попробовал первый, удалив его из FilterConfig, но он перестает работать, думая о добавлении дополнительной проверки, чтобы предотвратить повторное обращение к одной и той же странице снова и снова. – jiggergargle

+0

Вы также можете изучить использование встроенного в AuthenticationAttribute' и [FormsAuthentication] (https://msdn.microsoft.com/en-us/library/system.web.security.formsauthentication%28v=vs.110%29. aspx) –

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