取消/阻止Dot网核心的路由导航

本文关键字:路由 导航 核心 阻止 Dot 取消 | 更新日期: 2023-09-27 18:12:15

我在c# Dot Net Core中有一个典型的API,在接收$.getJSON(apiUrl)ajax请求时返回订单列表,如下所示:

$.getJSON("api/Orders")
    .done(function (data) {
        // On success, 'data' contains a list of products.
        $.each(data, function (key, item) {
            // Add a list item for the product.
            $('<li>', { text: formatItem(item) }).appendTo($('#products'));
        });
    });

我的控制器简单如下:

    public class OrdersController 
{
    [HttpGet("api/Orders")]
    public object Orders()
    { 
        return new
        {
            .
            .
        };
    }
}

以上对我来说很好。

我的问题是,如果用户在浏览器中输入一个url,如:http://localhost/api/Orders,他将得到相同的输出,我想防止。

。我需要允许仅通过ajax访问我的API,并且需要防止(或取消或重定向)它,如果通过浏览器地址行中的navigation接收。

谢谢

取消/阻止Dot网核心的路由导航

您将无法禁止导航请求。

你真正能做的就是检查特定的头,表明这是一个AJAX请求。像X-Requested-With。但是任何基本的http客户端都允许人们添加它

感谢所有的点击,我通过创建middleware解决了这个问题,如下所示:

  1. 创建文件夹Middleware
  2. 在这个新文件夹中,我创建了两个文件MiddleWalewareExtensions.csRequestHeaderMiddleware.cs

  3. MiddleWalewareExtensions.cs是定义我们所有中间件的一个,在这个例子中它只是一个,代码是:

    using Microsoft.AspNetCore.Builder;    // for IApplicationBuilder
    namespace myApp.Middleware
    {
       public static class MiddlewareExtensions  
    {
       public static IApplicationBuilder UseRequestHeaderMiddleware(this IApplicationBuilder builder)
    {
        return builder.UseMiddleware<RequestHeaderMiddleware>();
    }
    ... here you can define others
    

    }}

  4. RequestHeaderMiddleware是中间件,检查url是否包含单词api,只有当头包含user-key并且该键是有效的时才执行,否则返回错误。如果链接不包含API字,则执行时不带需要用户密钥

     using Microsoft.AspNetCore.Http;
     using System.Threading.Tasks;
     namespace myApp.Middleware
     {
     public class RequestHeaderMiddleware  
     {
     private readonly RequestDelegate _next;
     public RequestHeaderMiddleware(RequestDelegate next)
     {
         _next = next;
     }
    public async Task Invoke(HttpContext context)
    {
        string url = context.Request.Path;
        if (url.Contains("api") && !context.Request.Headers.Keys.Contains("user-key"))
        {
            context.Response.StatusCode = 400; //Bad Request                
            await context.Response.WriteAsync("You need a user key to be able to access this API..");
            return;
        }
        else
            {
                if(context.Request.Headers["user-key"] != "28236d8ec201df516d0f6472d516d72d")
                {
                    context.Response.StatusCode = 401; //UnAuthorized
                    await context.Response.WriteAsync("Invalid User Key");
                    return;
                }
            }
        await _next.Invoke(context);
       }
      }
     } 
    
  5. Startup.cs文件中添加using myApp.Middleware;然后:

    public void Configure(IApplicationBuilder app) 
    {
       app.UseRequestHeaderMiddleware();
       app.UseMvc(routes =>
       {
        routes.MapRoute(
            name: "default",
            template: "{controller=Home}/{action=Index}/{id?}");
       });
    
  6. 在JavaScript client app中添加xmlhttp所需的标头,如:

       xmlhttp.setRequestHeader("user-key", "28236d8ec201df516d0f6472d516d72d");