在我的帐户控制器中,在登录操作中,具有以下代码:
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)。
对不起,如果我的问题不是很清楚,我是新手......
答案 0 :(得分:2)
您的路线有两个问题:
我不建议将“”映射到登录。这实际上是主页。将主页映射到登录没有多大意义。当您从任何页面属性返回HttpStatusCode.Unauthorized
响应时,应自动请求您的登录页面。如果您希望仅由授权用户访问您的主页,也可以从主页返回未经授权的回复。就是这样。
这是一个非常好的主意,请阅读有关MVC(路由,控制器,身份验证,授权)如何工作的更多信息。否则,您可能最终得到一个远离安全的应用程序。 StackOverflow非常适合解决个别问题,但无助于您了解全局。你仍然需要了解其中的工作原理。
当你有完全相同的两个模式时,只有第一个匹配,因为MVC在找到匹配时会停止。您的默认值对此没有帮助。相反,您需要定义以下模式:
"Admin/{action}/{id}", new { controller = "Admin" }
"Basic/{action}/{id}", new { controller = "Basic" }
因此,如果网址以“基本”开头,则管理员不会匹配,反之亦然。
您可以使用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
答案 2 :(得分:0)
我认为您不需要MapRoutes,因为您只需重定向到视图。因为两个MapRoutes都具有相同的结构,所以它只保留最后一个是Admin。