{"id":692,"date":"2016-05-30T15:01:00","date_gmt":"2016-05-30T15:01:00","guid":{"rendered":"https:\/\/staging.infragistics.com\/blogs\/?p=692"},"modified":"2025-02-25T15:33:08","modified_gmt":"2025-02-25T15:33:08","slug":"secure-applications-in-asp-net","status":"publish","type":"post","link":"https:\/\/www.infragistics.com\/blogs\/secure-applications-in-asp-net","title":{"rendered":"10 Tips for Writing Secure Applications in ASP.NET"},"content":{"rendered":"\n<p>Security is one of the most important aspects of any application \u2013 and when we talk about security, particularly in ASP.NET applications, it is not limited to development.<\/p>\n\n\n\n<p>A secure app involves multiple layers of security in the configuration, framework, web server, database server, and more. In this post, we\u2019ll take a look at the top nine tips for writing secure applications in ASP.NET.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"1-cross-site-scripting-xss\">1. Cross Site Scripting (XSS)<\/h2>\n\n\n\n<p>This vulnerability allows an attacker to inject some malicious code while entering data. It could be JavaScript code, VB script, or any other script code.&nbsp;By default, ASP.NET MVC validates the inputs and throws a server error in case of script. Say we put the script in the input form:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/2818.Brij_5F00_post_5F00_1.png\" alt=\" registration form\" title=\" registration form\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/2818.Brij_5F00_post_5F00_1.png\"><\/a><\/p>\n\n\n\n<p>When we submit the above page, we\u2019ll get the error below:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/1325.Brij_5F00_post_5F00_2.png\" alt=\" we submit the above page, we\u2019ll get the error\" title=\"we submit the above page, we\u2019ll get the error\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/1325.Brij_5F00_post_5F00_2.png\"><\/a>By default, the razor view engine protects from XSS attacks. But there are certain scenarios (blogging, social applications, etc.) where we might need to allow html tags in input controls. For that, we have an option to add the&nbsp;<em>ValidateInput<\/em>&nbsp;filter as&nbsp;<em>false<\/em>:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[HttpPost]\n[ValidateInput(false)]\npublic async Task &lt; ActionResult > Register(RegisterViewModel model) {\n    if (ModelState.IsValid) {\n        \/\/  Etc.\n    }\n}<\/pre>\n\n\n\n<p>But this is very risky because here we not validating the complete request. Say the model has twenty properties, all will be exempt from the validation while we might need to allow html in only one or a few controls.<\/p>\n\n\n\n<p>In that scenario, instead of using this&nbsp;<em>ValidateInput<\/em>, we should put the an attribute&nbsp;<em>AllowHTML<\/em>&nbsp;in the specific ViewModel\u2019s property as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">public class RegisterViewModel {\n    [Required]\n    [AllowHtml]\n    [Display(Name = \"User Name\")]\n    public string Name {\n        get;\n        set;\n    }\n...\n}<\/pre>\n\n\n\n<p>Now we can use tags for the name only.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"2-cross-site-resource-forgery-csrf\">2. Cross Site Resource Forgery (CSRF)<\/h2>\n\n\n\n<p>CSRF (also known as one click attack) is a type of malicious attack where unauthorized commands are fired from a trusted website where the user is authenticated. In real world scenario, say the user logged into an application with windows\/cookie based authentication. Now without logging out, the user visits a malicious site and clicks on a button. The external website initiates a request via your website for doing an unethical operation. It will be considered as valid request because the request is authenticated.<\/p>\n\n\n\n<p>To prevent from CSRF attacks, MVC provides&nbsp;<em>AntiForgeryToken<\/em>&nbsp;mechanism. For that we need to use AntiForgeryToken helper in view as<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">@Html.AntiForgeryToken()<\/pre>\n\n\n\n<p>And to validate the token, we need to put&nbsp;&nbsp;<em>Antiforgerytoken<\/em>&nbsp;filter over action as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">[ValidateAntiForgeryToken]\npublic async Task &lt; ActionResult > Register(RegisterViewModel model) {\n    if (ModelState.IsValid) {\n        \/\/ etc.\n    }\n    return View(model);\n}<\/pre>\n\n\n\n<p>It creates two tokens in response, one is set as a cookie and other is set in a hidden field as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;form action=\"\/Account\/Register\" class=\"form-horizontal\" method=\"post\" role=\"form\">\n&lt;input name=\"__RequestVerificationToken\" type=\"hidden\" value=\"Qorw9RPABdHoRC7AojnSnQYYuGZP5iPF63UFVSw_[\u2026]\" \/><\/pre>\n\n\n\n<p>While submitting the form both of the tokens (cookie and hidden field) are sent to the server. Both are validated at the server, and&nbsp;&nbsp;if either one is not present or tampered then the request is not allowed.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"3-handling-errors-properly\">3. Handling Errors Properly<\/h2>\n\n\n\n<p>Errors are bound to happen, and they find their way to reach user. But if they are not handled properly, errors can leak internal information to the outside world, which can be a threat to the application. Following YSOD is common when an unhandled exception occurs:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/1732.Brij_5F00_post_5F00_3.png\" alt=\" \"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/1732.Brij_5F00_post_5F00_3.png\"><\/a>But see how much information it is showing to outside world: internal code, physical file structure, stack trace, and the version of ASP.NET and .NET framework.<\/p>\n\n\n\n<p>One quick fix could be setting&nbsp;<em>customErrors<\/em>&nbsp;mode on as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;customErrors mode=\"On\">&lt;\/customErrors> <\/pre>\n\n\n\n<p>This will show an ASP.NET default error page in case of each error. To handle it in better way, use custom errors mode&nbsp;<em>RemoteOnly<\/em>&nbsp;and have a common error page which gets displayed in case of error.<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;customErrors mode=\"RemoteOnly\" redirectMode=\"ResponseRewrite\" defaultRedirect=\"~\/Error.aspx\" \/><\/pre>\n\n\n\n<p>Here we are displaying our own error page in case of an error.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"4-sql-injection\">4. SQL Injection<\/h2>\n\n\n\n<p>SQL injection is a well-known security vulnerability, but it is still not handled properly in many applications. SQL injection allows hackers to tamper with existing data, modify transactions, or even delete data or databases, which can be a major loss to business.<\/p>\n\n\n\n<p>Using this technique, the hacker injects some malicious SQL commands via input. These commands have the power to change the SQL statement running on the server.&nbsp;&nbsp;Say authenticating a user in an application, we have written a query in a class as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"select * from Users where UserName='\"+txtUserName.Text+\"'and Password='\"+txtPwd.Text+\"' \";<\/pre>\n\n\n\n<p>Now user puts the following value in user name:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/0777.Brij_5F00_post_5F00_4.png\" alt=\" \"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/0777.Brij_5F00_post_5F00_4.png\"><\/a><\/p>\n\n\n\n<p>Now the query will be generated on server as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">select * from Users where UserName='\u2019 or 1=1 --' and Password='\"+txtPwd.Text+\"' \";<\/pre>\n\n\n\n<p>This will always return items and allow users to get into the application.<\/p>\n\n\n\n<p>To handle this, the best way is to use SQL stored procedure where we will pass the values a parameter or at least use the parameters as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">\"select * from Users where UserName= @username and Password=@password\u201d<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"5-click-jacking\">5. Click-Jacking<\/h2>\n\n\n\n<p>Click-Jacking is another major vulnerability that gets ignored normally. In this, the attacker uses an opaque layer to trick the user to click on a button or link on different page (say transfer button on the bank website) while they are intended to click on the top level page.<\/p>\n\n\n\n<p>To avoid this issue, we should not allow any website of different domain in iframe to open. To achieve this, we need to add a response header X-FRAME-OPTIONS as&nbsp;<em>deny<\/em>&nbsp;or&nbsp;<em>sameorigin<\/em>. In ASP.NET, we can set in&nbsp;<em>Global.asax<\/em>&nbsp;as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">void Application_BeginRequest(object sender, EventArgs e)\n{\n    HttpContext.Current.Response.AddHeader(\"X-FRAME-OPTIONS \", \"DENY\");\n}<\/pre>\n\n\n\n<p>It will add the header in all the responses send by the application.<\/p>\n\n\n\n<p>We can also use IIS to add the same header. In IIS, go to the intended website, and go to HTTP Headers tab and add a custom header with the header X-FRAME-OPTIONS as discussed. You will need to restart IIS to get it into effect.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"6-hide-application-structure-directory-listing\">6. Hide Application Structure\/ Directory Listing<\/h2>\n\n\n\n<p>Would you like to share the folder structure of your application to the end user?&nbsp;&nbsp;No! Right? Let\u2019s see an example. I have deployed ASP.NET web forms default application on IIS so now when I access the URL, it displays:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/3414.Brij_5F00_post_5F00_5.png\" alt=\"the deployed ASP.NET web forms default application on IIS so now when I access the URL\" title=\"the deployed ASP.NET web forms default application on IIS so now when I access the URL\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/3414.Brij_5F00_post_5F00_5.png\"><\/a>It shows all the files and folders available under Account. This information can be a potential threat to the application if publically available.<\/p>\n\n\n\n<p>Directory browsing should be disabled at IIS. When it is disabled, we see:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/3581.Brij_5F00_post_5F00_6.png\" alt=\" Directory browsing should be disabled at IIS. When it is disabled\" title=\"Directory browsing should be disabled at IIS. When it is disabled\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/3581.Brij_5F00_post_5F00_6.png\"><\/a>It returns 403 (forbidden), but that still leaves some vulnerability as it tells the user that this folder is available. When we try to access a directory which is not available, it returns 404.<\/p>\n\n\n\n<p>For this, we can write our own custom http handler and configure it so that it always return 404 whenever anybody try to access a folder.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"7-encrypt-sensitive-information-in-web-config\">7. Encrypt Sensitive Information in Web.config<\/h2>\n\n\n\n<p>Many times we put critical information in the Web.config, most commonly the connection string.<\/p>\n\n\n\n<p>To encrypt any part of connection string, we need to navigate to framework folder on command prompt (say C:\\Windows\\Microsoft.NET\\Framework\\v4.0.30319 ) and run the following command:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">aspnet_regiis -pef \"connectionStrings\" path<\/pre>\n\n\n\n<p>Here&nbsp;<em>path<\/em>&nbsp;is the path of the folder where Web.config resides. After running the command, it shows as:<\/p>\n\n\n\n<figure class=\"wp-block-image\"><img decoding=\"async\" src=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/2746.Brij_5F00_post_5F00_7.png\" alt=\" path\u00a0is the path of the folder where Web.config resides\" title=\"path\u00a0is the path of the folder where Web.config resides\"\/><\/figure>\n\n\n\n<p><a href=\"https:\/\/www.infragistics.com\/community\/cfs-filesystemfile.ashx\/__key\/CommunityServer.Blogs.Components.WeblogFiles\/brijmishra.March_5F00_blogs\/2746.Brij_5F00_post_5F00_7.png\"><\/a>Similarly we can encrypts other section like &lt;appsettings&gt; etc.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"8-secure-cookies\">8. Secure Cookies<\/h2>\n\n\n\n<p>Cookies are small text stored by browsers on users\u2019 machines that travel between the web server and browser. Cookies are used to store the user related information for the specific website. In ASP.NET, Session Id is one of the most common pieces of information for which cookies are used to save.<\/p>\n\n\n\n<p>As this information is stored in plain text on a user\u2019s machine, it could be an easy target for attackers. There are couple of steps we need to take to avoid storing data in cookies, such as setting an expiry date and encrypting the data. Apart from these two steps, there are two more things which we should do:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Allow cookies on SSL only<\/li>\n\n\n\n<li>Set the cookies as&nbsp;<em>HTTPOnly<\/em>. This makes sure that cookies cannot be read by client side script so our session or Form authentication token could not read on a browser.<\/li>\n<\/ol>\n\n\n\n<p>We can make the settings in Web.config as:<\/p>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;httpCookies domain=\"String\" httpOnlyCookies=\"true \"requireSSL=\"true \" \/><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"9-encrypting-view-state\">9. Encrypting View State<\/h2>\n\n\n\n<p>View State is one of the most common techniques used to maintain the state between the Page PostBacks in ASP.NET Web forms. View State is saved in a hidden variable on the page with id&nbsp;<em>__VIEWSTATE<\/em>. When we see that in view source, we find that it contains a series of numbers and characters. Be sure that it is not encrypted but in base64 format. Anybody can decode it to read the information.<\/p>\n\n\n\n<p>There are two options to encrypt and make it tamper proof. There is the property&nbsp;<em>ViewStateEncryptionMode,<\/em>&nbsp;which can be set at page level in the aspx file or can be set it in&nbsp;<em>Web.config<\/em>&nbsp;which applies to all the pages in the application. It encrypts the view state before putting it into the response. Similarly, another property,&nbsp;<em>EnableViewStateMac,<\/em>&nbsp;can be set as true at the page or in Web.config. It creates a hash of the view state content and added in the hidden field. In the next post back, again the hash gets created and verified. If it does not match, then post back is rejected and an error is thrown.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"10-remove-sensitive-information-from-response-headers\">10.\u00a0Remove Sensitive Information From Response Headers<\/h2>\n\n\n\n<p>Here is the response header of a page of an ASP.NET application:<\/p>\n\n\n\n<p>Here we can see that it is revealing too much information to the end user, which they don\u2019t require like in IIS version, site built on, and ASP.NET version. If an attacker knows the loopholes of any of them, he or she can exploit the vulnerability. This information is by default added, and we should remove it unless and until specifically required.<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>To remove ASP.NET version header, we just need to add the following in the&nbsp;<em>Web.config<\/em>:<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">&lt;system.web>\n  &lt;httpRuntime enableVersionHeader=\"false\" \/>\n&lt;\/system.web><\/pre>\n\n\n\n<ol start=\"2\" class=\"wp-block-list\">\n<li>To remove MVC version, we need to go&nbsp;<em>AppliCation_Start<\/em>&nbsp;event in&nbsp;<em>Global.asax<\/em>&nbsp;and add the following code:<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">MvcHandler.DisableMvcResponseHeader = true;<\/pre>\n\n\n\n<ol start=\"3\" class=\"wp-block-list\">\n<li>X-Power-By is added by IIS and can be removed by adding the following configuration<\/li>\n<\/ol>\n\n\n\n<pre class=\"EnlighterJSRAW\" data-enlighter-language=\"generic\" data-enlighter-theme=\"\" data-enlighter-highlight=\"\" data-enlighter-linenumbers=\"\" data-enlighter-lineoffset=\"\" data-enlighter-title=\"\" data-enlighter-group=\"\">  &lt;system.webServer>\n        &lt;httpProtocol>\n            &lt;customHeaders>\n                &lt;remove name=\"X-Powered-By\" \/>\n            &lt;\/customHeaders>\n        &lt;\/httpProtocol>\n  &lt;\/system.webServer><\/pre>\n\n\n\n<h2 class=\"wp-block-heading\" class=\"wp-block-heading\" id=\"conclusion\">Conclusion<\/h2>\n\n\n\n<p>In this post, we discussed that security is key for any web application, and if not handled properly, it can harm the business significantly. We discussed nine of the most common vulnerabilities of ASP.NET web applications and saw that most of these can be fixed by making some configuration change or minor code changes.<\/p>\n\n\n\n<p><em>Build full-featured business apps for any browser with Infragistics ASP.NET controls!&nbsp;<a href=\"https:\/\/www.infragistics.com\/products\/ultimate\/download?p=asp.net\">Download Free Trial now<\/a>.<\/em><\/p>\n\n\n\n<p><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Security is one of the most important aspects of any application \u2013 and when we talk about security, particularly in ASP.NET applications, it is not limited to development.<\/p>\n","protected":false},"author":21,"featured_media":997,"comment_status":"publish","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-692","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-how-to"],"_links":{"self":[{"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/posts\/692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/users\/21"}],"replies":[{"embeddable":true,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/comments?post=692"}],"version-history":[{"count":7,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/posts\/692\/revisions"}],"predecessor-version":[{"id":2046,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/posts\/692\/revisions\/2046"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/media\/997"}],"wp:attachment":[{"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/media?parent=692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/categories?post=692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.infragistics.com\/blogs\/wp-json\/wp\/v2\/tags?post=692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}