C# MVC5(Asp.Net4.5.2)-重定向到操作执行';在一个案例中不返回

C# MVC5(Asp.Net4.5.2)-重定向到操作执行';在一个案例中不返回,c#,asp.net-mvc-5,C#,Asp.net Mvc 5,在我的帐户控制器中,在登录操作中,具有以下代码: case "Sucess": string rule = CheckRule(model.username, model.Password); Response.SetCookie(SetAuthCookie(model.username, model.RememberMe, rule)); re

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

                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");
    }
}

以及:

}

在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用户数据,效果很好(show de BasicUserRule)


抱歉,如果我的问题不太清楚,我是新手…

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

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

路由存在两个问题:

  • 我不建议将“”映射到登录。这实际上就是主页。将主页映射到登录并没有多大意义。当您从任何页面、属性返回
    HttpStatusCode.Unauthorized
    响应时,应自动请求您的登录页面。若你们希望你们的主页只被授权用户访问,那个么也要从主页返回未经授权的响应。就是这样

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

  • 当两个模式相邻时,只有第一个模式会匹配,因为MVC在找到匹配时停止。您的默认值在这方面没有帮助。相反,您需要定义如下模式:

    "Admin/{action}/{id}", new { controller = "Admin" } 
    "Basic/{action}/{id}", new { controller = "Basic" }
    
    因此,如果URL以“Basic”开头,Admin将不匹配,反之亦然


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

    路由存在两个问题:

  • 我不建议将“”映射到登录。这实际上就是主页。将主页映射到登录并没有多大意义。当您从任何页面、属性返回
    HttpStatusCode.Unauthorized
    响应时,应自动请求您的登录页面。若你们希望你们的主页只被授权用户访问,那个么也要从主页返回未经授权的响应。就是这样

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

  • 当两个模式相邻时,只有第一个模式会匹配,因为MVC在找到匹配时停止。您的默认值在这方面没有帮助。相反,您需要定义如下模式:

    "Admin/{action}/{id}", new { controller = "Admin" } 
    "Basic/{action}/{id}", new { controller = "Basic" }
    
    因此,如果URL以“Basic”开头,Admin将不匹配,反之亦然

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

    谢谢

    我的问题是路由,我在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"}
                 );
    
    这解决了一切。 我听从了他的建议,寻求更多的信息,这里有一些有趣的链接:

    谢谢镇静药

    我的问题是路由,我在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"}
                 );
    
    这解决了一切。 我听从了他的建议,寻求更多的信息,这里有一些有趣的链接:


    你好,镇静,谢谢你的回答,我会修复这些路由,但是
    HttpStatusCode.Unauthorized
    ,我可以在哪里配置帐户登录的自动响应?我将登录url放在Web.config的FormsAuthentication中:
    @RogérioFerreira,这就足够了。这是默认行为。如果您想在操作之前强制登录到,也可以使用
    [Authorize]
    属性(而不是处理HTTP结果)。嗨,镇静,谢谢回答,我会修复这些路由,但是
    HttpStatusCode.Unauthorized
    ,我可以在哪里为帐户登录配置此自动响应?我将登录url放在Web.config的FormsAuthentication中:
    @RogérioFerreira,这就足够了。这是默认行为。如果要在执行操作之前强制登录到,也可以使用
    [Authorize]
    属性(而不是处理HTTP结果)。我看到了我的应用程序的其他解决方案,我将不得不重做一些事情。我看到了我的应用程序的其他解决方案,我将不得不重做一些事情。