取消/阻止 Dot Net Core 中的路线导航

Cancelling / Preventing route navigation in Dot Net Core

我在 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 接收,则需要阻止(或取消或重定向)它。

谢谢

您将无法禁止导航请求whole-sale。

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

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

  1. 创建了一个文件夹Middleware
  2. 在这个新文件夹中,我创建了 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的中间件,仅当header包含[=21]时才执行=] 且此键有效,否则返回错误。 如果 link 不包含 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);
       }
      }
     } 
    
    1. 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?}");
         });
      
    2. 在 JavaScript client app 中将所需的 header 添加到 xmlhttp 中,例如:

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