2015-02-16 2 views
2

Если пользователь вошел в систему, я хочу показать свое представление отдела, если он не вошел в систему, чтобы показать страницу входа. Я пытался что-то вроде этого в моей RouteConfigПоказывать представления на основе состояния аутентификации в asp.net mvc

public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 
      if (HttpContext.Current.User==null) 
     { 
      routes.MapRoute(
       name: "Default", 
       url: "{controller}/{action}/{id}", 
       defaults: new { controller = "Account", action = "Login", id = UrlParameter.Optional } 
       ); 
     } 
     else 
     { 
      routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Department", action = "Index", id = UrlParameter.Optional } 
       ); 
     } 

    } 

Но это всегда загружает Логин страницу в startup.Can кого указать на то, что я делаю неправильно здесь? Примечания: Я использую Asp.net Identity для этого приложения

+3

RegisterRoutes не выполняется за один вызов, но один раз за запуск приложения. –

+0

@RoyDictus Есть ли альтернатива, доступная для выполнения того, что я хочу? – Athul

+2

Эта статья о MSDN может вас заинтересовать: http://blogs.msdn.com/b/webdev/archive/2013/10/20/building-a-simple-todo-application-with-asp-net- identity-and-association-users-with-todoes.aspx –

ответ

5

Вашей HttpContext.Current.User==null логики будет идти в контроллере, а не регистрацию маршрута

Примечание- правильного вызова Request.IsAuthenticated

Если у вас есть метод действия, как это :

public ViewResult Index() 
{ 
    if(Request.IsAuthenticated) 
    return new RedirectResult("toLoginPage") 
    else 
    return new View("loggedInView"); 
} 

Однако, я считаю, атрибут [Authorize] может быть то, что вы хотите в вашем случае использования: (примечание - Перечитав этот вопрос, это может быть не точны, так как вы хотите, чтобы вернуть другую точку зрения, основываясь на состоянии входа)

[Authorize] 
public ViewResult ShowPerson(int id) 
{ 
    return new View("loggedInView"); 
} 

И в ваш web.config, что-то вроде

<system.web> 
<authentication mode="Forms"> 
    <forms loginUrl="~/Account/Login" /> 
</authentication> 
</system.web> 

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

+0

Вы технически верны, но то, что я хочу, в точности обратное. Хотите, чтобы моя стартовая страница была настроена для входа в систему, и если пользователь зарегистрирован в качестве перенаправления на главную страницу – Athul

+0

, вы можете зарегистрировать атрибут Authorize в глобальных фильтрах - http://blogs.msdn.com/b/rickandy/archive/2011/ 05/02/securing-your-asp-net-mvc-3-application.aspx – Alex

+0

@Alex в Identity framework 'FormsAuthentication' должен быть отключен в' web.config'. Но все остальное верно. – trailmax

1

Создать ваш собственный Ауто Атрибут rization:

public class CustomAuthorize: AuthorizeAttribute 
{ 
    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) 
    { 
     if(filterContext.HttpContext.User.Identity.IsAuthenticated) 
     { 
      base.HandleUnauthorizedRequest(filterContext); 
     } 
     else 
     { 
      filterContext.Result = new RedirectToRouteResult(new 
      RouteValueDictionary(new{ controller = "Error", action = "AccessDenied" })); 
     } 
    } 
} 

Затем добавьте [CustomAuthorize] к контроллеру и изменить маршрут он указывает.

Это было взято из here

+0

таким образом произойдет перенаправление дополнительного браузера –

1

Вы можете добиться этого с ограничениями маршрута:

public class DelegateConstraint : IRouteConstraint 
{ 
    private readonly Func<HttpContextBase, bool> _isMatch; 

    public DelegateConstraint(Func<HttpContextBase, bool> isMatch) 
    { 
     _isMatch = isMatch; 
    } 

    public bool Match(HttpContextBase httpContext, Route route, string parameterName, RouteValueDictionary values, RouteDirection routeDirection) 
    { 
     return _isMatch(httpContext); 
    } 
} 

public class RouteConfig 
{ 
    public static void RegisterRoutes(RouteCollection routes) 
    { 
     routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

     routes.MapRoute(
      name: "CustomAuth1", 
      url: "AuthArea/{action}/{id}", 
      defaults: new { controller = "Department", action = "Index", id = UrlParameter.Optional }, 
      constraints: new { auth = new DelegateConstraint(httpContext => !httpContext.Request.IsAuthenticated) } 
      ); 

     routes.MapRoute(
      name: "CustomAuth2", 
      url: "AuthArea/{action}/{id}", 
      defaults: new { controller = "Account", action = "Index", id = UrlParameter.Optional }, 
      constraints: new { auth = new DelegateConstraint(httpContext => httpContext.Request.IsAuthenticated) } 
      ); 

     routes.MapRoute(
      name: "Default", 
      url: "{controller}/{action}/{id}", 
      defaults: new { controller = "Home", action = "Index", id = UrlParameter.Optional } 
     ); 
    } 
} 

В этом примере URL ~/AuthArea будут разрешены счета или контроллер отдела в зависимости от Request.IsAuthenticated имущество.

UPDATE: Таким образом, вы получите полную возможность маршрутизации, но все же необходимо указать правильный контроллер:

@Html.ActionLink("Context dependent link", "Index", @Request.IsAuthenticated ? "Account" : "Department") 

Эта ссылка всегда будет показан как:

<a href="/AuthArea">Context dependent link</a> 
Смежные вопросы