2016-07-26 9 views
0

У меня есть настраиваемая аутентификация, так что пользователь хранится как переменная сеанса. После того, как они проходят через процесс счета/Войти хранить детали, возвращаемые из 3 партии API как пользователь в сессии, как это:Пользовательская аутентификация в MVC

Session["User"] = new UserViewModel(result); 

Я хочу, чтобы проверить пользователя присутствует перед каждым действием контроллера, так что я есть сделал BaseController со следующей проверки в нем:

protected override void OnActionExecuting(ActionExecutingContext filterContext) 
{ 
    if (Session["User"] != null) 
    base.OnActionExecuting(filterContext); 
    else 
    filterContext.Result = new RedirectToRouteResult(new System.Web.Routing.RouteValueDictionary(new { action = "LogIn", controller = "Account" })); 

Каждый из контроллеров, то наследующий от BaseController так, что он перенаправляет на страницу войти, если нет ни одного пользователя. Я не наследую от BaseController для AccountController, чтобы он не попадал в бесконечный цикл проверки и перенаправления, но я также хочу, чтобы определенные страницы не проверяли вход в систему. Есть ли способ сделать это, т.е. написать правило исключения так же, как у вас может быть [AllowAnonymous]?

+0

Почему бы не создать настраиваемый атрибут Authorize и применить его только к контроллерам, которым вы хотите выполнить эту проверку? – Alex

+0

Заменить атрибут авторизации вместо ActionFilters –

ответ

0

Вы можете использовать фильтр по этим методам, как:

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] 
public class ActionCheckAttribute : ActionFilterAttribute 
{ 
    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     string controllerName = filterContext.ActionDescriptor.ControllerDescriptor.ControllerName.ToLower().Trim(); 
     string actionName = filterContext.ActionDescriptor.ActionName.ToLower().Trim(); 

     // this is just a sample.. you can implement any logic you want 
     if (!actionName.StartsWith("your method name") && !controllerName.StartsWith("your controller name")) 
     { 
      var session1 = HttpContext.Current.User.Identity.Name; 
      HttpContext ctx = HttpContext.Current; 
      //Redirects user to login screen if session has timed out 
      if (session1 == null) 
      { 
       base.OnActionExecuting(filterContext); 

       filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new 
       { 
        controller = "Account", 
        action = "LogOff" 
       })); 
      } 
     } 

    } 
} 

затем на контроллерах поставить атрибут как:

[ActionCheck] 
public class MyController : Controller 
{ 
    public ActionResult Index() 
    { 
     return View(); 
    } 
} 

или на конкретных методах действий, как:

[ActionCheck] 
public Actionresult SomeMethod() 
{ 
    return View(); 
} 
Смежные вопросы