1

一个很长的解释结束时的小问题......

假设属于管理员角色的管理员用户和属于用户角色的普通用户尝试使用在 Global.asax 中注册的以下路由访问索引页面。

 routes.MapRoute(
     "Default", // Route name
     "{controller}/{action}/{id}", // URL with parameters
      new { controller = "Home", action = "Index", id = UrlParameter.Optional }, 
      new[] {"tst.Controllers"}
 );

在 HomeController 中,Index Action Method 用 Authorize 属性修饰。

[Authorize]
public ActionResult Index()
{
    ViewBag.Message = "Welcome to ASP.NET MVC!";

    return View();
}

强制匿名用户登录。

如果管理员用户使用他/她的凭据登录,我想将他/她重定向到位于管理区域的 HomeController 中的索引操作方法。

如果普通用户登录,我想将他/她重定向到位于用户区域的 HomeController 中的索引操作方法。

我在 UserAreaRegistration.cs 中有以下代码

public override void RegisterArea(AreaRegistrationContext context)
{
  context.MapRoute(
  "User", 
  "Profile/{action}", 
  new { area = AreaName, Controller = "Home", action = "Index" }, 
  new { RoleConstraint = new RoleConstraint()},
  new[]{ "tst.Areas.User.Controllers"}
  );
}

以及 AdminAreaRegistration.cs 的以下代码

public override void RegisterArea(AreaRegistrationContext context)
{
  context.MapRoute(
  "Admin", 
  "Profile/{action}", 
  new { area = AreaName, Controller = "Home", action = "Index" }, 
  new { RoleConstraint = new RoleConstraint()},
  new[]{ "tst.Areas.Admin.Controllers"}
  );
}

其中 RoleConstraint 定义如下

public class RoleConstraint: IRouteConstraint
{
    public bool Match(
        HttpContextBase httpContext, 
        Route route, 
        string parameterName, 
        RouteValueDictionary values, 
        RouteDirection routeDirection)
    {
        RoleProvider rp = new tst.Providers.CustomRoleProvider();
        string[] roles = rp.GetRolesForUser(httpContext.User.Identity.Name);
        if (roles != null && roles.Length > 0)
        {
            string roleName = roles[0];
            string areaName = route.Defaults["area"].ToString();
            return areaName == roleName;            
        }
        return false;
    }
}

主控制器文件夹中 AdminController 中的标准 LogOn 操作方法...

 [HttpPost]
 public ActionResult LogOn(LogOnModel model, string returnUrl)
 {
   if (ModelState.IsValid)
   {
     if (Membership.ValidateUser(model.UserName, model.Password))
     {
       FormsAuthentication.SetAuthCookie(model.UserName, model.RememberMe);
       if (Url.IsLocalUrl(returnUrl) 
           && returnUrl.Length > 1 
           && returnUrl.StartsWith("/")
           && !returnUrl.StartsWith("//") 
           && !returnUrl.StartsWith("/\\"))
       {
           return Redirect(returnUrl);
       }
       else
       {
           return RedirectToAction("Index", "Home");
       }
     }
     else
     {
       ModelState.AddModelError("", "The user name or password is incorrect.");
     }
   }

   // If we got this far, something failed, redisplay form
   return View(model);
 }

问题: 我的想法是否正确,当验证管理员/普通用户时,他/她必须在上面代码片段的这一行中重定向

return RedirectToAction("Index", "Home");  

到相应的索引操作方法(阅读:相应区域中的索引操作方法)。

如果是这样,我想知道如何。

我很困惑,因为涉及到一个常量字符串“Profile”,它不是涉及操作方法和控制器名称的常见内容。“配置文件”既不是控制器也不是操作方法。

受这篇文章的启发 MVC 基于角色的路由

4

1 回答 1

0

代替

return RedirectToAction("Index", "Home");  

在登录操作方法中,我将其替换为

return Redirect("/Profile");

有效 !!!

但是,我不明白的是,当我单击注销时,它会在主视图文件夹中呈现索引页面。所以我必须再次单击 LogOff 才能返回 LogOn 页面。

于 2012-12-06T13:28:05.237 回答