【问题标题】:Different default pages/controllers for every role type - MVC 5每种角色类型的不同默认页面/控制器 - MVC 5
【发布时间】:2014-01-06 17:57:56
【问题描述】:

所以我的 Q 如下(MVC 5): 我有几种类型的默认页面,我想在我的应用启动时启动。

1- 匿名用户

2...5 - 用于自动记录的其他用户角色 (cookie)。

所以这几乎是一个简单的“如果”,我知道,但同时我正在使用 User.IsInRole("RoleName") 方法,该方法不能在 RouteConfig.cs。

如果它是 Using 语句的简单添加,我提前为问题的简单性道歉。

更新:我已经通过一些方法做到了:

if(User.UserInRole("RoleName") return RedirectToAction("ActionName") 在我的默认 ActionResault 中。

虽然它不是一个优雅的解决方案,也没有定义许多默认页面,但它完成了工作。

【问题讨论】:

    标签: c# asp.net-mvc asp.net-mvc-routing asp.net-mvc-5


    【解决方案1】:

    这并不像你想象的那么简单。

    在执行此类操作时,您必须考虑多种情​​况。比如……

    场景 A:

    1. 匿名用户访问您的网站主页。
    2. 用户单击“登录”。
    3. 用户登录。
    4. 系统将用户引导到哪里?

    场景 B:

    1. 匿名用户通过主页以外的某个深层链接访问您的网站。
    2. 用户单击“登录”。
    3. 用户登录。
    4. 系统将用户引导到哪里?

    场景 C:

    1. 用户访问了除主页之外的某个深层链接,该链接之前已通过网站身份验证,并且仍然具有有效的身份验证 cookie。
    2. 网站将用户引导到哪里?

    我有点着急,所以可能很难理解我在说什么。关键是,您必须考虑用户访问您网站的不同方式。通常,我将这种功能连接到注册和登录过程中。你将无法通过路由做你想做的事情。

    【讨论】:

    • 我已经涵盖了所有这些场景,每个用户登录类型都被重定向到特定的操作链接(也包括在安全区域中)。我只需要为当前会话中连接的不同用户类型使用不同的默认页面。现在我的默认页面是登录页面,但是如果一个 cookie 用户进入我的网站,他的默认页面不应该是登录页面......这只是......不专业。除非所有这些路由都在 Login ActionResault 中,这可能会起作用,我现在就尝试一下,尽管我更喜欢一种更优雅的方式来这样做。谢谢。
    • 如果经过身份验证的用户登陆我的 HomeController.Index 操作,我会执行 if (User.IsInRole(...)) { RedirectToAction(...); } 在索引操作中。
    • 是的,这正是我所做的。 (更新了我的帖子)
    • 我忘了提一件事,如果用户(匿名或经过身份验证的)尝试直接访问某个内部页面,例如 /members/shopping,我会继续让用户尝试访问该页面页。我不会尝试根据角色重定向它们。我让内置的授权系统确定他们是否有权访问该页面。如果他们没有通过身份验证,他们会自动重定向到登录。一旦他们授权,我将他们发送回他们试图获取的位置(通常通过 returnUrl 参数)。
    • 是的,我已经使用 [Authorize(Roles = "RoleName")] 注释完成了这项工作。
    【解决方案2】:

    解决此问题的一种方法是创建一个“基本”控制器,所有其他控制器都从该控制器继承。在此控制器中,您可以编写 IF/CASE 语句,并且可以覆盖基本控制器的 Initialize、OnActionExecuting 和 OnResultExecuting 方法,以根据您的逻辑重定向您希望用户最终到达的位置。

    所以基本上你会像这样创建一个基本控制器:

    public class BaseController : Controller
    {
       protected string RedirectPath = string.Empty;
       protected bool DoRedirect = false;
    
       protected override void Initialize(RequestContext requestContext)
       {
          base.Initialize(requestContext);
          // Your logic to determine whether to redirect or not goes here. Bellow is an example...
          if (requestContext.HttpContext.User.IsInRole("RoleName"))
          {
             DoRedirect = true;
             RedirectPath = Url.Action("SomeAction", "SomeController");
          }
       }
    
       protected override void OnActionExecuting(ActionExecutingContext filterContext)
       {
           base.OnActionExecuting(filterContext);
           if (DoRedirect)
           {
              // Option 1: TRANSFER the request to another url
              filterContext.Result = new TransferResult(RedirectPath);
              // Option 2: REDIRECT the request to another url
              filterContext.Result = new RedirectResult(RedirectPath);
           }
       }
    }
    

    然后每个必须遵守此用户角色重定向逻辑的控制器都需要从 BaseController 继承:

    public class HomeController : BaseController
    {
        // Controller logic here...
    }
    

    【讨论】:

    • 我以前见过针对不同 _Layouts 的解决方案,我可以为此目的使用该解决方案吗?我的意思是为不同的用户定义不同的默认路由?如果是这样,我会很高兴举一个简短的例子。
    • 您到底想完成什么?这不会定义不同的默认路由。如果用户担任某个角色,它本质上会将用户重定向到不同的路线......这对你有用吗?
    • 是的,这正是我需要的。
    • @Maratto 我用一个简单的例子更新了我的答案......希望这会有所帮助。
    【解决方案3】:

    【讨论】:

      猜你喜欢
      • 2014-10-21
      • 2015-04-18
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      • 1970-01-01
      • 2016-02-28
      相关资源
      最近更新 更多