【问题标题】:MVC5(Asp.Net4.5.2)- RedirectToAction does'nt return in one caseMVC 5(Asp.Net4.5.2)- RedirectToAction 在一种情况下不返回
【发布时间】:2019-03-25 11:31:57
【问题描述】:

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

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

在检查规则中,我返回带有另一个控制器名称的字符串,其中包括 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 用户数据,这很好用(显示 de BasicUserRule)。

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

【问题讨论】:

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


    【解决方案1】:

    您的路线有两个问题:

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

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

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

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

      因此,如果 URL 以“Basic”开头,则不会匹配 Admin,反之亦然。

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

    【讨论】:

    • 嗨 Sedat,感谢您的回答,我会修复这些路由,但是 HttpStatusCode.Unauthorized,我可以在哪里配置帐户登录的自动响应?我将登录网址放在 Web.config 上的 FormsAuthentication 中:<authentication mode="Forms"> <forms loginUrl="\Account\Login.cshtml"...
    • @RogérioFerreira 应该足够了。这是默认行为。如果您想在操作之前强制登录,也可以使用 [Authorize] 属性(而不是处理 HTTP 结果)。
    【解决方案2】:

    感谢 Sedat!

    我的麻烦是路由,我在 url 参数中用控制器设置了 de route:

    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

    【讨论】:

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

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

    【讨论】:

      猜你喜欢
      • 2020-03-31
      • 1970-01-01
      • 1970-01-01
      • 2023-03-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多