取消/阻止 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
解决了这个问题:
- 创建了一个文件夹
Middleware
在这个新文件夹中,我创建了 2 个文件 MiddleWalewareExtensions.cs
和 RequestHeaderMiddleware.cs
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
}
}
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);
}
}
}
在 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?}");
});
在 JavaScript client app
中将所需的 header 添加到 xmlhttp
中,例如:
xmlhttp.setRequestHeader("user-key", "28236d8ec201df516d0f6472d516d72d");
我在 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
解决了这个问题:
- 创建了一个文件夹
Middleware
在这个新文件夹中,我创建了 2 个文件
MiddleWalewareExtensions.cs
和RequestHeaderMiddleware.cs
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
} }
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); } } }
在
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?}"); });
在 JavaScript
client app
中将所需的 header 添加到xmlhttp
中,例如:xmlhttp.setRequestHeader("user-key", "28236d8ec201df516d0f6472d516d72d");