基于角色的默认起始视图

3
我能找到一些基于角色的身份验证的例子,但这不是一个身份验证问题。我有三种用户类型,其中一种我想要有一个不同的默认起始页面。路由配置在用户信息可用之前初始化。
简而言之:如果角色A或角色B从下面开始。
Controller: Home 
Action: Index

否则:

Controller: Other
Action: OtherIndex

这应该在哪里以及如何实现?

编辑

这只应该在网站首次访问时发生,其他用户可以转到Home / Index,但不是默认情况下。

编辑

使用Brad的建议,我创建了一个重定向属性,具有他的重定向逻辑,并将其应用于Index。然后我为该页面创建了另一个操作。这样,如果我确实需要允许访问HomeIndex,我可以专门将其分配给Home / HomeIndex,并且使用默认路由的任何内容都可以访问Home / Index。

[RedirectUserFilter]
public ActionResult Index()
{
     return HomeIndex();
}

对于那些需要的人 - 这是属性。
 public class RedirectUserFilterAttribute: ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext actionContext)
        {

            if (!HttpContext.Current.User.IsInRole("Role A") 
            && !HttpContext.Current.User.IsInRole("Role B"))
            {
               actionContext.Result = new RedirectToRouteResult(
               new RouteValueDictionary {
                           { "Controller", "OtherController" }, 
                           { "Action", "OtherAction" } });
             }

          }
       }
1个回答

5
public class HomeController : Controller
{
    public ActionResult Index()
    {
        if (
            !User.IsInRole("Something") &&
            !User.IsInRole("Role B")
        ) return RedirectToAction("OtherIndex");
        // ...
    }
}

同样适用于OtherController
或者,您可以创建自己的ActionFilter,寻找一个惯例命名的操作(例如,优先选择带有角色名称的IndexRolename而不是Index)。

我并不总是想要重定向,只有在第一次访问网站时才需要。 - Seth
2
我认为 ActionFilterAuthorizationFilter 是更好的选择,这样你就可以将规则应用于所有请求,而不必将代码添加到每个操作方法中。 - asymptoticFault
@Seth:你可以使用会话或配置文件标志来监视请求,由你决定。 - Brad Christie
@Brad - 我这里缺少一块拼图,这个方法确保了索引始终重定向,但我只想在“应用程序启动”时执行。您认为创建一个具有此逻辑的默认操作是您的建议吗?这样其他用户需要将Home/index指向该操作吗? - Seth
1
@Seth 我相信在你更新问题并表示你只想检查第一次访问之前,Brad已经回答了。正如他们在上面的评论中所说,您需要在数据库中跟踪它是他们的第一次访问,比如在会话或配置文件表中。您可以在应用程序启动时检查/设置此标志,或者更好的是,在会话开始时检查/设置此标志,然后我建议使用自定义ActionFilterAuthorizationFilter在路由应用后检查标志,并在必要时重定向。 - asymptoticFault

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接