Allow Only Ajax Requests For An Action In ASP.NET Core
ASP.NET Core offers attributes such as [HttpGet] and [HttpPost] that allow you to restrict the HTTP verbs used to invoke an action. You can also use HttpRequest object's Method property to detect the HTTP verb behind the current request. However, at times you need to know whether a request is an Ajax request or not. You may also need to restrict an action only to Ajax calls. Although thee is no inbuilt way to accomplish this task, you can easily implement such a feature in your application. This article discusses how.
Detecting HTTP method and Ajax request
In order to know the HTTP method being used by the current request you can use the following line of code :
string method = HttpContext.Request.Method;
The HttpRequest object's Method property returns HTTP verb being used by the current request such as GET and POST.
Detecting whether a request is an Ajax request or not requires a bit of different code. The Method property will return the HTTP method whether a request is an Ajax request or otherwise. So, you need to check a special HTTP header. The following line of code shows that :
string requestedWith =
HttpContext.Request.Headers["X-Requested-With"];
The X-Requested-With header returns a string that indicates whether it's an Ajax request or not. An Ajax request will have this header set to XMLHttpRequest. This header value won't be present for normal GET and POST requests (non-Ajax requests).
Ok. So, how do we ensure that our action code gets invoked only if it's an Ajax request. Let's write a fragment of code :
public IActionResult Index()
{
string method = HttpContext.Request.Method; string requestedWith =
HttpContext.Request.Headers["X-Requested-With"]; if (method=="POST")
{
if(requestedWith == "XMLHttpRequest")
{
// code goes here
}
} return View();
}
Suppose we want to ensure that our action code gets executed only when it's an Ajax POST request. The above piece of code does just that.
Extension method that detects an Ajax request
Although the above piece of code works as expected, it lacks reusability. Let's make it easy to use by wrapping it in an extension method to HttpRequest object.
public static class HttpRequestExtensionMethods
{ public static bool IsAjax(this
HttpRequest request, string httpVerb = "")
{
if (request == null)
{
throw new ArgumentNullException
("Request object is Null.");
} if (!string.IsNullOrEmpty(httpVerb))
{
if (request.Method != httpVerb)
{
return false;
}
} if (request.Headers != null)
{
return request.Headers["X-Requested-With"]
== "XMLHttpRequest";
} return false;
}
}
The above code defines an extension method called IsAjax() on the HttpRequest object. The IsAjax() method also takes httpVerb parameter that can be used to specify an HTTP verb such as GET or POST.
The second if condition checks whether current request's HTTP method matches with what has been provided in the IsAjax() method's httpVerb parameter. If it doesn't a value of false is returned to the caller.
The third if condition checks whether the request is an Ajax request or not. It does so using the X-Requested-With header. If X-Requested-With header value is not XMLHttpRequest we return false.
Once this extension method is added you can see it in the controller like this :
And you can use it like this :
bool isAjax = HttpContext.Request.IsAjax("POST");
The above call to IsAjax() returns true only if the request under consideration is an Ajax POST request.
Creating custom [Ajax] attribute
So far so good. Let's improvise our code further. We will now wrap the Ajax checking logic in a custom attribute named [Ajax] so that you can use it like this :
As you can see the GetEmployee() action is decorated with [Ajax] attribute. And the HttpVerb property of [Ajax] is set to GET.
The [Ajax] attribute ensures that GetEmployee() is invoked only if the request is an Ajax GET request.
Let's dissect the code that makes the [Ajax] attribute:
public class AjaxAttribute : ActionMethodSelectorAttribute
{
public string HttpVerb { get; set; } public override bool IsValidForRequest
(RouteContext routeContext, ActionDescriptor action)
{
return routeContext.HttpContext.
Request.IsAjax(HttpVerb);
}
}
Here, we create AjaxAttribute class, a custom ActionMethodSelectorAttribute. This attribute does the conditional checking of whether a request is an Ajax request or not.
The [Ajax] has HttpVerb property and it also overrides the IsValidForRequest() method. Inside we simply call IsAjax() extension method we created earlier. You can also put the entire request checking logic inside the IsValidForRequest() method.
Testing our code
In order to test our code let's make an Ajax GET and POST request to the GetEmplooyee() action. Notice that the GetEmployee() returns a JSON with certain EmoployeeID, FirstName, and LastName.
<h1>Welcome!</h1> <button type="button" id="button1">Make Ajax Call</button> <form method="post" action="/home/GetEmployee">
<button type="submit" id="button2">Submit Form</button>
</form>
The above markup is from Index.cshtml. It shows two <button> elements - one making Ajax request and the other making normal non-Ajax POST request.
A dash of jQuery code is used to make a GET request to the GetEmployees() :
$(document).ready(function () {
$("#button").click(function () {
$.get("/home/GetEmployee", function (data) {
alert(data.employeeID + " " +
data.firstName + " " +
data.lastName);
});
});
});
I won't go into the details of this jQuery code since it is quite straightforward. If suffices to say that the code code attempts to calls the GetEmployee() action using GET method.
The following figure shows a sample run of the page.
What if we make a non-Ajax POST request? See the following run :
As you can see, this time the server returns HTTP status code 404. That's because the request is not an Ajax request. Moreover it's a POST request. So, the [Ajax[ is going to treat it as an invalid request and won't allow the GetEmployees() to execute.
That's it for now! Keep coding !!
Allow Only Ajax Requests For An Action In ASP.NET Core的更多相关文章
- Ajax跨域问题及解决方案 asp.net core 系列之允许跨越访问(Enable Cross-Origin Requests:CORS) c#中的Cache缓存技术 C#中的Cookie C#串口扫描枪的简单实现 c#Socket服务器与客户端的开发(2)
Ajax跨域问题及解决方案 目录 复现Ajax跨域问题 Ajax跨域介绍 Ajax跨域解决方案 一. 在服务端添加响应头Access-Control-Allow-Origin 二. 使用JSONP ...
- [React] Create a queue of Ajax requests with redux-observable and group the results.
With redux-observable, we have the power of RxJS at our disposal - this means tasks that would other ...
- MVC中使用Ajax提交数据 Jquery Ajax方法传值到action
Jquery Ajax方法传值到action <script type="text/javascript"> $(document).ready(function(){ ...
- 再谈Jquery Ajax方法传递到action 【转载】
原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://cnn237111.blog.51cto.com/2359144/984466 之 ...
- 再谈Jquery Ajax方法传递到action(转)
之前写过一篇文章Jquery Ajax方法传值到action,本文是对该文的补充. 假设 controller中的方法是如下: public ActionResult ReadPerson(Perso ...
- 转 Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5
Using $.ajaxPrefilter() To Configure AJAX Requests In jQuery 1.5 Posted February 18, 2011 at 6:29 PM ...
- Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案
最近的项目中涉及到了应用ajax请求后台系统登录,身份认证失败,经过不断的调试终于找到解决方案. 应用场景: 项目测试环境:前端应用HTML,js,jQuery ajax请求,部署在Apache服务器 ...
- ASP.NET Core 1.0中实现文件上传的两种方式(提交表单和采用AJAX)
Bipin Joshi (http://www.binaryintellect.net/articles/f1cee257-378a-42c1-9f2f-075a3aed1d98.aspx) Uplo ...
- Upload Files In ASP.NET Core 1.0 (Form POST And JQuery Ajax)
Uploading files is a common requirement in web applications. In ASP.NET Core 1.0 uploading files and ...
随机推荐
- SpringBoot-MongoDB 索引冲突分析及解决
一.背景 spring-data-mongo 实现了基于 MongoDB 的 ORM-Mapping 能力, 通过一些简单的注解.Query封装以及工具类,就可以通过对象操作来实现集合.文档的增删改查 ...
- [翻译] 使用 Python 创建你自己的 Shell:Part I
目录 使用 Python 创建你自己的 Shell:Part I 原文链接与说明 步骤 0:项目结构 步骤 1:Shell 循环 步骤 2:命令切分 步骤 3:执行 运行 使用 Python 创建你自 ...
- 图像检索(2):均值聚类-构建BoF
在图像检索时,通常首先提取图像的局部特征,这些局部特征通常有很高的维度(例如,sift是128维),有很多的冗余信息,直接利用局部特征进行检索,效率和准确度上都不是很好.这就需要重新对提取到的局部特征 ...
- NFS服务和DHCP服务讲解(week3_day2)--技术流ken
NFS服务端概述 NFS,是Network File System的简写,即网络文件系统.网络文件系统是FreeBSD支持的文件系统中的一种,也被称为NFS: NFS允许一个系统在网络上与他人共享目录 ...
- 从零开始学安全(四十)●上传文件MIME类型绕过漏洞防御
MIME检测原理 服务端MIME类型检测是通过检查http包的Content-Type字段中的值来判断上传文件是否合法的. php示例代码: if($_FILES['userfile']['type' ...
- 小程序中使用ECharts 异步加载数据
官网例子都是同步的,怎么引入及同步demo请移步官网 <view class="container"> <ec-canvas id="mychart-d ...
- 前端入门23-CSS预处理器(Less&Sass)
声明 本篇内容梳理自以下几个来源: Github:smyhvae/web Bootstrap网站的 less 文档 Sass中文网 感谢大佬们的分享. 正文-CSS预处理(less&Sass) ...
- (最完美)MIUI12系统的Usb调试模式在哪里开启的步骤
当我们使用安卓手机通过数据线链接到Pc的时候,或者使用的有些app比如我们公司营销小组当使用的app引号精灵,之前的老版本就需要开启usb调试模式下使用,现当新版本不需要了,如果手机没有开启usb调试 ...
- 章节十、3-CSS Selector---用CSS Selector - ID定位元素
一.如果元素的 ID 不唯一,或者是动态的,或者 name 以及 linktext 属性值也不唯一,对于这样的元素,我们 就需要考虑用 xpath或者css selector 来查找元素了,然后再对元 ...
- PHP下CodeIgniter框架连接读取MS Access数据库文件
cI用的是3.0版本,测试用的access为.mdb文件,php要读取Access数据库有两种驱动,一种的odbc,一种是pdo_odbc,两种都可以链接,但是一般会更推荐pdo_odbc, 要想ph ...