2012-12-04 85 views
0

小問題在很長的解釋到底...MVC基於角色的路由澄清

假設屬於管理員角色和屬於用戶角色嘗試用下面的訪問索引頁的普通用戶的管理員用戶在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中,索引操作方法使用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; 
    } 
} 

的主Cont中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」,它不是涉及操作方法和控制器名稱的通常東西。 「配置文件」既不是控制器也不是操作方法。

在登錄操作的方法通過這個帖子的啓發

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

MVC role-based routing

回答

0

相反,我

return Redirect("/Profile"); 

它的工作取代它!

但是,我不明白的是,當我單擊註銷時,它呈現主視圖文件夾中的索引頁。所以我必須再次點擊LogOff才能返回LogOn頁面。

+0

你可以發佈什麼註銷返回? –