2016-11-16 4 views
0

Попытка создать базовый контроллер, который наследуется на всем моем сайте при его динамической загрузке на основе пользовательской роли.OWIN Auth HTTPContext NULL на BaseController

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

Ниже BaseController имени LayoutController

[Authorize] 
public class LayoutController : Controller 
{ 
    public List<NavigationMenuModel> MainLayoutViewModel { get; set; } 

    public LayoutController() 
    { 
     this.MainLayoutViewModel = new List<NavigationMenuModel>(); 
     using (var context = new OperationalDataContext()) 
     { 
    //The BELOW LINE IS ISSUE 
      var username = HttpContext.GetOwinContext().Authentication.User.Identity.Name; 
      var pages = context.GET_PAGES_BY_USERNAME(username); 
      var pagesTop = pages.Where(x => x.Parent == null); 
      foreach (var page in pagesTop) 
      { 
       var tmpNM = new NavigationMenuModel(); 
       tmpNM.DisplayName = page.Name; 
       tmpNM.RelativeUrl = page.RelativeUrl; 
       var children = pages.Where(x => x.Parent != null && x.Parent.Equals(page.Name) && x.Site.Equals("PRODUCT")); 
       List<NavigationMenuModel> tmpChildren = new List<NavigationMenuModel>(); 
       foreach (var child in children) 
       { 
        var tmpC = new NavigationMenuModel(); 
        tmpC.DisplayName = child.Name; 
        tmpC.RelativeUrl = child.RelativeUrl; 
        var children1 = pages.Where(x => x.Parent != null && x.Parent.Equals(child.Name) && x.Site.Equals("PRODUCT")); 
        List<NavigationMenuModel> tmpChildren1 = new List<NavigationMenuModel>(); 
        foreach (var child1 in children) 
        { 
         var tmpC1 = new NavigationMenuModel(); 
         tmpC1.DisplayName = child1.Name; 
         tmpC1.RelativeUrl = child1.RelativeUrl; 
         tmpChildren1.Add(tmpC1); 
        } 
        tmpC.Children = tmpChildren1; 
       } 
       tmpNM.Children = tmpChildren; 
       this.MainLayoutViewModel.Add(tmpNM); 
      } 
     } 
     this.ViewBag["MainLayoutViewModel"] = this.MainLayoutViewModel; 
    } 
} 

Тогда есть dashboardController (домашняя страница)

public class DashboardController : LayoutController 
{ 
    // GET: Dashboard 
    public ActionResult Index() 
    { 
     return View("Index"); 
    } 
} 

у нас есть простой, основанный логин печенья, которое позволяет anayomous

public class AccountController : Controller 
{ 
    IAuthenticationManager AuthenticationManager 
    { 
     get { return HttpContext.GetOwinContext().Authentication; } 
    } 

    [HttpGet] 
    [AllowAnonymous] 
    [Route("login")] 
    public ActionResult Login() 
    { 
     return View("Login"); 
    } 
} 
} 

В startup.css

public void ConfigureAuthentication(IAppBuilder app) 
    { 
     app.UseCookieAuthentication(new CookieAuthenticationOptions 
     { 
      AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie, 
      LoginPath = new PathString("/Login"), 
     }); 
    } 

Проблемы, кажется, что он не перенаправляет войти, прежде чем пытаться перейти к разводке.

AccountController не ссылается на LayoutController.

ответ

0

Проблема в том, что вы выполняете то, что вы делаете в конструкторе контроллера.

Атрибут Authorize проверяет каждый метод, если пользователь вошел в систему, а если нет - перенаправляет его на страницу входа. Код конструктора выполняется при создании пути Controller до того, как вызывается какой-либо метод.

Переопределите OnActionExecuting на LayoutController и переместите туда код конструктора. Я не совсем уверен, что атрибут Authorize перехватывает вызовы методам контроллеров доOnActionExecuting, но я бы попробовал.

Кстати: AllowAnonymous используется для обращения к контроллерам Authorize атрибут для одного метода. Поэтому, если ваш AccountController не установил этот атрибут, использовать его в AllowAnonymous. Но это немного не по теме.

Надеюсь, это поможет.

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