MVC5(Asp.Net4.5.2) - RedirectToAction在一个案例中没有返回

时间:2016-09-01 00:11:50

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

在我的帐户控制器中,在登录操作中,具有以下代码:

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

在checkrule中,我返回带有其他控制器名称的字符串,其中包括Admin和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,这很好用(show de BasicUserRule)。

对不起,如果我的问题不是很清楚,我是新手......

3 个答案:

答案 0 :(得分:2)

您的路线有两个问题:

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

    这是一个非常好的主意,请阅读有关MVC(路由,控制器,身份验证,授权)如何工作的更多信息。否则,您可能最终得到一个远离安全的应用程序。 StackOverflow非常适合解决个别问题,但无助于您了解全局。你仍然需要了解其中的工作原理。

  2. 当你有完全相同的两个模式时,只有第一个匹配,因为MVC在找到匹配时会停止。您的默认值对此没有帮助。相反,您需要定义以下模式:

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

    因此,如果网址以“基本”开头,则管理员不会匹配,反之亦然。

  3. 您可以使用Route Debugger了解路由匹配的工作原理以及请求如何映射到路由。

答案 1 :(得分:2)

谢谢Sedat!

我的麻烦是路线,我在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

答案 2 :(得分:0)

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