2016-09-01 79 views
0

在我的账户控制器,在登录操作,有下面的代码:MVC5(Asp.Net4.5.2) - RedirectToAction在一种情况下一点儿也不回

   case "Sucess": 
        string rule = CheckRule(model.username, model.Password); 
        Response.SetCookie(SetAuthCookie(model.username, model.RememberMe, rule)); 
        return RedirectToAction("Index", rule); 

在checkrule,我返回字符串的名字另一个控制器,其中有管理员和BasicUser,这里是这些代码:

{ 
[Authorize] 
public class AdminController : Controller 
{ 
    private bool attAuthor = isAuthorized(); 
    private bool attAuth = isAuthenticated(); 
    private string rule = returnrule(); 
    // GET: Admin 
    public ActionResult Index() 
    { 
     if (!attAuthor) 
     { 
      return RedirectToAction("erro401",rule); 
     } 
     else 
     { 
      return View(); 
     } 


    } 

    public ActionResult erro401() 
    { 
     return View("erro401"); 
    } 

}

和:

{ 
[Authorize] 
public class BasicUserController : Controller 
{ 
    private bool attAuthor = isAuthorized(); 
    private bool attAuth = isAuthenticated(); 
    private string rule = returnrule(); 
    // GET: BasicUser 
    public ActionResult Index() 
    { 
     if (!attAuthor) 
     { 
      return RedirectToAction("erro401", rule); 
     } 
     else 
     { 
      FormsAuthenticationTicket authticket = get_ticket(); 
      string str = rule + "/" + authticket.Name; 
      ViewBag.Htmlstr = str; 
      return View(); 
     } 


    } 

    public ActionResult erro401() 
    { 
     return View("erro401"); 
    } 


} 

}

在RouteConfig:

routes.IgnoreRoute("{resource}.axd/{*pathInfo}"); 

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

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

如果我和它完美的管理员用户登录,但有一个基本的用户navagador不重定向到的路线,简单地说就是登录屏幕上,如果我输入控制器地址的作品。 我添加了一个标签html来查看cookie userdata,这工作正常(显示的BasicUserRule)。

很抱歉,如果我的问题不是很清楚,我是新手...

回答

1

有两个问题与你的路线:

  1. 我不建议映射“”登录。这实际上是首页。将主页映射到登录没有多大意义。当您从任何页面,属性返回HttpStatusCode.Unauthorized响应时,应自动请求您的登录页面。如果您希望只有授权用户才能访问您的主页,请返回来自主页的未经授权的回复。就是这样。

    这是一个非常好的主意,详细了解MVC(路由,控制器,认证,授权)是如何工作的。否则,你可能会得到一个远离安全的应用程序。 StackOverflow对解决个别问题很有帮助,但无助于您理解大局。你仍然需要了解东西的工作原理。

  2. 当两个模式完全相同时,只有第一个匹配,因为MVC在找到匹配时会停止。您的默认值在这里没有帮助。你需要自行定义状花纹:

    "Admin/{action}/{id}", new { controller = "Admin" } 
    "Basic/{action}/{id}", new { controller = "Basic" } 
    

    所以如果URL以“基本法”开始,管理员将无法匹配,反之亦然。

您可以使用Route Debugger了解路由匹配的工作方式以及您的要求得到如何映射到路线。

+0

塞达特您好,感谢的答案,我会解决这些路线,但'HttpStatusCode.Unauthorized',在那里我可以配置此帐户登录自动响应?我把登录URL放在Web.config上的FormsAuthentication中:'

+0

@RogérioFerreira应该足够了。这是默认行为。如果您想在操作前强制登录,您还可以使用'[Authorize]'属性(而不是处理HTTP结果)。 –

+1

谢谢,我已经做到了。 –

0

我认为不需要你MapRoutes因为你只是TE重定向到一个视图。因为两个MapRoutes具有相同的结构,它将只保留最后一个是Admin的结构。

2

谢谢塞达特!

我的烦恼是路线,我设定控制器德路线URL参数:

routes.MapRoute(
       name: "BasicUser", 
       url: "BasicUser/{action}/", 
       defaults: new { controller = "BasicUser", action = "Index" } 
      ); 
      routes.MapRoute(
       name: "Admin", 
       url: "Admin/{action}/", 
       defaults: new { controller = "Admin", action = "Index"} 
      ); 

这解决了一切。 我跟着他的建议,并要求提供更多资讯,这里有一些有趣的链接:

MVC Routing with different Areas with multiple controllers

Customizing-Routes-in-ASP-NET-MVC

(PT-BR)trabalhando-com-rotas-no-aspnet-mvc.aspx

+0

我看到了我的应用程序的其他解决方案,我将不得不重做一些事情。 –

相关问题