URL包含特定查询参数时,如何绕过所有其他MVC路由?

时间:2019-05-03 01:47:18

标签: c# asp.net-core asp.net-core-mvc asp.net-core-routing

我需要捕获任何包含 URLToken 查询参数的请求,例如以下URL:

http://test.server.com/product?URLToken=4abc4567ed ...

并将其重定向到特定的控制器和操作。

我尝试设置各种受约束的路线,包括以下所示的路线。

app.UseMvc(routes =>
{
    routes.MapRoute(
           name: "ssocapture",
           template: "{*stuff}",
           defaults: new { controller = "Account", action = "SingleSignOn" },
           constraints: new { stuff= @"URLToken=" }  );

    routes.MapRoute(
           name: "default",
           template: "{controller=home}/{action=index}/{id?}");
}); 

SingleSignOn开头的中断点永远不会通过此规则命中(以下指向动作的直接链接的确触及了中断点,因此我知道控制器和动作都在工作)。

http://test.server.com/account/singlesignon?URLToken=4abc4567ed ...

我在想什么/做错了什么?

2 个答案:

答案 0 :(得分:1)

路由并非旨在做到这一点。要实现您的目标,只需在UseMVC()

之前添加一个中间件
app.Use((ctx , next)=>{
    var token = ctx.Request.Query["URLToken"].FirstOrDefault();
    if(token!=null){
        ctx.Response.Redirect($"somecontroller/specificaction/{token}"); // redirect as you like
        // might be :
        //  ctx.Response.Redirect($"Account/SingleSignOn/{token}");
    }
    return next();
});

app.UseMvc(routes =>
{
    routes.MapRoute(
        name: "default",
        template: "{controller=Home}/{action=Index}/{id?}");
});

答案 1 :(得分:0)

如果您不想使用中间件,我认为在您的控制器中很容易做到。您将获得的另一个好处是,您可以为所有其他路由设置RouteName,并使用RedirectToRoute方法将其重定向到该路由。因此,在您的UrlToken动作中:

[Route("[action]"]
public IActionResult SingleSignOn(string urlToken)
{
    If (!string.IsNullOrWhitespace(urlToken))
    {
        return RedirectToRoute("RouteName"):
    }
}

要使上述方法起作用,您必须通过使用AttributeRouting或在启动时全局定义为其他操作指定RouteName:

[Route("[action]", Name = "otherroute")]
public IActionResult OtherAction(string param1, string param 2)
{
    //...
}

因此,只需将您的SingleSignOn动作中的“ RouteName”替换为“ otherroute”,即可使用。如果需要将路由参数传递给“ otherroute”,则可以使用RedirectToRoute方法的重载之一。我希望这会有所帮助。