AngularJS哈希url和MVC路由

时间:2016-07-06 10:41:16

标签: angularjs asp.net-mvc url-routing asp.net-mvc-routing routeconfig

我在导航到网址时遇到问题。我的默认页面设置为“登录”,我的应用程序URL为http://localhost:12345?auth=123654654656564/#/

这很有效,但用户可以通过两种方式登录应用程序

  
      
  1. 直接通过申请。
  2.   
  3. 通过查询字符串获取用户名和密码。
  4.   

当应用程序通过查询字符串进行日志记录时,网址就像routes.MapRoute( name: "Default", url: "{controller}/{action}", defaults: new { controller = "Account", action = "Login"} );

我想从网址中删除身份验证值。我试图映射路由,但它不起作用。

view

此外,我还尝试创建一个将返回routes.MapRoute( name: "ActualDefault", url: "{controller}/{action}", defaults: new { controller = "Account", action = "LoginQuery" } );

的操作结果
 public ActionResult Login()
 {
     if (Request.QueryString.Count > 0 && Request.QueryString != null)
     {
         //validating
         return RedirectToAction("LoginQuery", "Account");
     }
     else
     {
         return View();
     }
 }
 public ActionResult LoginQuery()
 {
        return View("Index");
 }

控制器:

http://localhost:12345/Account/LoginQuery/#/

以上代码删除了查询字符串,但网址为http://localhost:12345/#/

我只需要像{{1}}这样的网址。

1 个答案:

答案 0 :(得分:1)

通过查询字符串登录

  

如果不指出这是一个非常糟糕的做法,我会疏忽大意。登录应用程序时应始终使用HTTP POST,并在帖子正文中发送用户机密,而不是查询字符串。

     

           

请注意,您也可以使用纯HTML(或通过angularjs)创建表单来调用MVC操作方法,或者您可以通过JavaScript或其他一些编程语言进行HTTP POST来执行相同的操作。

MVC路由查询字符串值 完全忽略 。但您可以使用查询字符串值创建自定义路由。

public class LoginViaQueryStringRoute : RouteBase
{
    public override RouteData GetRouteData(HttpContextBase httpContext)
    {
        var path = httpContext.Request.Path;

        if (!string.IsNullOrEmpty(path))
        {
            // Don't handle URLs that have a path /controller/action
            return null;
        }

        var queryString = httpContext.Request.QueryString;

        if (!queryString.HasKeys())
        {
            // Don't handle the route if there is no query string.
            return null;
        }

        if (!queryString.AllKeys.Contains("username") && !queryString.AllKeys.Contains("password"))
        {
            // Don't handle the case where controller and action are missing.
            return null;
        }

        var routeData = new RouteData(this, new MvcRouteHandler());

        routeData.Values["controller"] = "Account";
        routeData.Values["action"] = "LoginQuery";
        routeData.Values["username"] = queryString["username"];
        routeData.Values["password"] = queryString["password"];

        return routeData;
    }

    public override VirtualPathData GetVirtualPath(RequestContext requestContext, RouteValueDictionary values)
    {
        return null;
    }
}

用法

public class RouteConfig
{
    public static void RegisterRoutes(RouteCollection routes)
    {
        routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

        routes.Add(new LoginViaQueryStringRoute());

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

此路线现在与http://localhost:12345/?username=foo&password=bar匹配,并将其发送到您的LoginQuery操作方法。

通过http://localhost:12345/#/

登录

目前还不清楚您希望如何发挥作用。由于散列标记之后的所有内容通常都不会从浏览器发送到服务器,因此http://localhost:12345/#/等同于http://localhost:12345/。所以,你实际上是在说“我希望我的主页成为登录页面”。

在典型的MVC应用程序中,您可以在主页上设置AuthorizeAttribute将用户重定向到登录页面。在用户登录后,他们将被重定向回主页(或者通常是他们最初请求的任何安全页面)。

[Authorize]
public ActionResult Index()
{
    return View();
}

如果您希望所有应用程序受到保护,您可以在全局注册AuthorizeAttribute并在公共操作方法上使用AllowAnonymousAttribute(例如登录和注册页面)

public class FilterConfig
{
    public static void RegisterGlobalFilters(GlobalFilterCollection filters)
    {
        filters.Add(new AuthorizeAttribute());
        filters.Add(new HandleErrorAttribute());
    }
}

您的登录操作方法:

[AllowAnonymous]
public ActionResult Login()
{
    //...
}

[AllowAnonymous]
[HttpPost]
public ActionResult Login(LoginModel model)
{
    //...
}

[AllowAnonymous]
public ActionResult LoginQuery(string username, string password)
{
    //...
}

但是,那是典型的 MVC -only应用程序。

如果您使用Angular制作SPA,那么这可能是一个非常不同的故事。也就是说,您可能会在客户端上切换视图,而无需对登录表单执行HTTP 302重定向(也许它会是一个弹出窗口 - 谁知道)。关键是,没有任何关于如何设置客户端与MVC通信的细节,除了通常设置MVC在多页面应用程序中工作之外,不可能为您的客户端设置MVC提供任何有用的建议。

  

注意:我可以告诉您,您的路由配置错误。 DefaultActualDefault定义不能存在于相同的路由配置because the first match always wins中,因此第一个将运行而另一个将永远不会运行。两个路由URL定义都将匹配任何 URL,其长度为0,1或2个段,因此路由表中的第一个匹配将匹配,而另一个将是无法访问的执行路径