{"id":27482,"date":"2020-01-29T00:00:00","date_gmt":"2020-01-28T23:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=27482"},"modified":"2021-01-13T09:40:16","modified_gmt":"2021-01-13T08:40:16","slug":"sicurezza-in-asp-net-core-con-policy-e-claim","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/","title":{"rendered":"Sicurezza in ASP.NET Core con Policy e Claim"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"27483\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/attachment\/image00-11\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&amp;ssl=1\" data-orig-size=\"1024,608\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"image00-11\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?resize=1024%2C608&#038;ssl=1\" alt=\"\" class=\"wp-image-27483\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Quando si parla di sicurezza in un\u2019applicazione, viene sempre da pensare a qualcosa di indispensabile ma non sempre facile da implementare. Negli anni, mi \u00e8 capitato di utilizzare diversi modelli di autorizzazione: dal classico Role-Based alle autorizzazioni custom scritte ad hoc per il dominio applicativo. In questo articolo, analizziamo il nuovo modello di autorizzazione basato sulle policy introdotto dal .NET Core, che riesce facilmente ad adattarsi ad una grande variet\u00e0 di scenari.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Per capire fino in fondo questo modello, dobbiamo fare una veloce panoramica sulle autorizzazioni basate sui Ruoli, probabilmente il modello pi\u00f9 utilizzato, dalle cui limitazioni emergono le potenzialit\u00e0 del modello basato su policy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un&nbsp;<strong>ruolo&nbsp;<\/strong>non \u00e8 altro che una stringa che identifica un set di permessi per un utente autenticato nel sistema. Il modello di autorizzazione basato sui ruoli permette, in .NET, l\u2019utilizzo dell\u2019attributo&nbsp;<strong>Authorize<\/strong>&nbsp;per limitare l\u2019accesso ad una risorsa, in base al ruolo specificato. Quest&#8217;ultimo viene applicato a un controller o una action. Il codice che segue mostra come limitare l\u2019accesso al \u201cReportController\u201d ai soli amministratori del sistema, cio\u00e8 gli utenti che sono membri del ruolo \u201cAdministrator\u201d:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;Authorize(Roles = &quot;Administrator&quot;)]\npublic class ReportController : Controller\n{\u00a0\u00a0 \n\u00a0\u00a0\/\/Code\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Naturalmente, \u00e8 possibile specificare pi\u00f9 ruoli ammessi ad utilizzare un determinato controller: basta inserire i ruoli separati da una virgola.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;Authorize(Roles = &quot;Manager,Administrator&quot;)]\npublic class ReportController : Controller\n{\n\u00a0\u00a0\u00a0\/\/Code\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">L\u2019attributo Authorize, come detto precedentemente, \u00e8 applicabile sia a livello di controller che di action, questo ci permette di limitare l\u2019accesso a specifiche funzionalit\u00e0:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;Authorize(Roles = &quot;Manager, Administrator&quot;)]\npublic class ReportController : Controller\n{\n\u00a0\u00a0\u00a0\u00a0public ActionResult ViewReport()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Code\n\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0&#x5B;Authorize(Roles = &quot;Administrator&quot;)]\n\u00a0\u00a0\u00a0\u00a0public ActionResult DeleteAllReports()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/Code\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Possiamo limitare l\u2019accesso a ReportController ai soli utenti che appartengono ad entrambi i ruoli \u201cManager\u201d e \u201cAdministrator\u201d, rendendo pi\u00f9 stringente l\u2019autorizzazione.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;Authorize(Roles = &quot;Manager&quot;)]\n&#x5B;Authorize(Roles = &quot;Administrator&quot;)]\npublic class ReportController\u00a0 : Controller\n{\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Questi esempi evidenziano sia la facilit\u00e0 d\u2019uso che le limitazioni di questo modello. Immaginate ad esempio lo scenario in cui il vostro dominio non ha una sola figura di \u201cAmministratore\u201d, ma molteplici versioni di essa, un \u201cCustomerAdministrator\u201d, un \u201cProductAdministrator\u201d, un \u201cSuperAdministrator\u201d. La vostra applicazione dovr\u00e0 tenere conto di tutte queste figure, aumentando la granularit\u00e0 delle vostre autorizzazioni: quando il numero di ruoli aumenta la difficolt\u00e0 di gestione aumenta con essa. \u00c8 proprio in questi scenari che il modello basato su policy pu\u00f2 fare la differenza.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Partiamo dai tre concetti principali:&nbsp;<strong>Policy<\/strong>,&nbsp;<strong>Requirements<\/strong>&nbsp;e&nbsp;<strong>Handlers<\/strong>. Una policy \u00e8 un insieme di requisiti (requirements); un requisito \u00e8 un insieme di parametri che vengono utilizzati per validare l\u2019identit\u00e0 dell\u2019utente, mentre un handler \u00e8 usato per determinare se un utente ha accesso o meno ad una specifica risorsa utilizzando i parametri contenuti nei requisiti.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una policy viene di solito registrata allo startup dell\u2019applicazione, pi\u00f9 precisamente nel metodo&nbsp;<strong>ConfigureServices<\/strong>() della classe Startup.cs<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nservices.AddAuthorization(options =&gt;\n\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0options.AddPolicy(&quot;RequireManagerOnly&quot;, policy =&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0policy.RequireRole(&quot;Manager&quot;,&quot;Administrator&quot;));\n\u00a0\u00a0});\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Applicare una policy registrata \u00e8 un\u2019operazione molto semplice, basta utilizzare l\u2019attributo Authorize gi\u00e0 visto precedentemente, in una forma leggermente diversa:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\n&#x5B;Authorize(Policy = &quot;ShouldBeEmployeeOnly&quot;)]\npublic class ReportController : Controller\n{\n\u00a0\u00a0\u00a0\u00a0&#x5B;Authorize(Policy = &quot;RequireAdminOnly&quot;)]\n\u00a0\u00a0\u00a0\u00a0public ActionResult DeleteReports()\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\/\/code\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">La prima cosa che colpisce \u00e8 sicuramente la maggior espressivit\u00e0 delle policy: un altro sviluppatore, che lavorer\u00e0 sul vostro codice, sar\u00e0 sicuramente facilitato nel capire come avete protetto una determinata funzionalit\u00e0.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Nell\u2019esempio sono stati utilizzati i ruoli del nostro dominio. Questa per\u00f2 non \u00e8 l\u2019unica modalit\u00e0 disponibile: possiamo utilizzare anche i&nbsp;<strong>Claim<\/strong>&nbsp;per esprimere i requisiti di una policy.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un Claim non \u00e8 altro che una coppia chiave\/valore che identifica una caratteristica di un soggetto, come il nome, l\u2019et\u00e0, il numero di documento, ecc. In questo modo, riusciamo ad esprimere i requisiti di una policy attraverso il controllo del valore contenuto in un determinato Claim, come, ad esempio, abilitare una determinata funzione solo agli utenti maggiorenni.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La registrazione dei requisiti di una policy attraverso i claim viene fatta definendo la policy stessa. Se vogliamo, ad esempio, creare una policy che permette l\u2019accesso sulla base dell\u2019esistenza di un determinato claim per un utente autenticato nel sistema, possiamo farlo in questo modo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic void ConfigureServices(IServiceCollection services)\n{\n\u00a0\u00a0\u00a0\u00a0services.AddMvc();\n\u00a0\u00a0\u00a0\u00a0services.AddAuthorization(options =&gt;\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0options.AddPolicy(&quot;ShouldBeOnlyEmployee&quot;, policy =&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0policy.RequireClaim(&quot;EmployeeId&quot;));\n\u00a0\u00a0\u00a0\u00a0});\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Una volta registrata, la policy \u00e8 utilizzabile tramite l\u2019attributo Authorize su un controller o su una specifica Action.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&#x5B;Authorize(Policy = &quot;ShouldBeOnlyEmployee&quot;)]\npublic IActionResult SomeMethod()\n{\n\u00a0\u00a0\u00a0\u00a0\/\/Write your code here\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come detto precedentemente, \u00e8 possibile esprimere i requisiti della policy controllando il valore contenuto in un determinato Claim. Ecco lo snippet di codice che effettua questo controllo sul valore contenuto nel Claim \u201cIsAdmin\u201d:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic void ConfigureServices(IServiceCollection services)\u00a0 \n{\u00a0 \n\u00a0\u00a0\u00a0\u00a0services.AddMvc();\n\u00a0\u00a0\u00a0\n\u00a0\u00a0\u00a0\u00a0services.AddAuthorization(options =&gt;\u00a0 \n\u00a0\u00a0\u00a0\u00a0{\u00a0 \n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0options.AddPolicy(&quot;CustomSecurityPolicy&quot;, policy =&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0policy.RequireClaim(&quot;IsAdmin&quot;, &quot;true&quot;));\u00a0 \n\u00a0\u00a0\u00a0\u00a0});\u00a0 \n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Negli esempi fatti, gli handler erano impliciti. Vediamo adesso come possiamo creare un requirement custom da utilizzare con le nostre policy, e i possibili handler per gestirlo.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Un requirement, in .NET Core, \u00e8 una classe che implementa l\u2019interfaccia&nbsp;<strong>IAuthorizationRequirement<\/strong>&nbsp;e funge da contenitore dei parametri con cui verr\u00e0 poi gestito il requisito. Eccone un esempio:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class MinimumYearsInCompanyRequirement : IAuthorizationRequirement\n{\n\u00a0\u00a0\u00a0\u00a0public int MinimumYears { get; set; }\n\u00a0\u00a0\u00a0\u00a0public MinimumYearsInCompanyRequirement(int experience)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MinimumYears = experience;\n\u00a0\u00a0\u00a0\u00a0}\u00a0\u00a0\u00a0 \n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Un requirement pu\u00f2 avere uno o pi\u00f9 handler, che viene utilizzato per valutarne le propriet\u00e0. Un handler non \u00e8 altro che una classe che estende&nbsp;<strong>AuthorizationHandler&lt;T&gt;&nbsp;<\/strong>e implementa il metodo&nbsp;<strong>HandleRequirementAsync()<\/strong><\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class MinimumYearsHandler :\n\u00a0\u00a0AuthorizationHandler&lt;MinimumYearsInCompanyRequirement&gt;\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0protected override Task HandleRequirementAsync(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0AuthorizationHandlerContext context,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MinimumYearsInCompanyRequirement requirement)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0throw new NotImplementedException();\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Di seguito, il codice che contiene una semplice implementazione dell\u2019handler, che trova il claim e valuta il Requirement:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic class MinimumYearsHandler : AuthorizationHandler&lt;MinimumYearsInCompanyRequirement&gt;\n{\n\u00a0\u00a0\u00a0\u00a0protected override Task HandleRequirementAsync(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0AuthorizationHandlerContext context,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MinimumYearsInCompanyRequirement requirement)\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var user = context.User;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var claim = context.User.FindFirst(&quot;MinYears&quot;);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if(claim != null)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0var expInYears = int.Parse(claim?.Value);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0if (expInYears &gt;= requirement.MinimumYears)\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0context.Succeed(requirement);\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0}\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0return Task.CompletedTask;\n\u00a0\u00a0\u00a0\u00a0}\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Come potete vedere, nel caso in cui la valutazione dei parametri del requirement sia avvenuta con successo, basta chiamare il metodo&nbsp;<strong>Succeed()<\/strong>&nbsp;dell\u2019AuthorizationHandlerContext passandogli come argomento l\u2019istanza del Requirement, e rendendolo cos\u00ec soddisfatto e abilitare la funzionalit\u00e0 che avete protetto.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">La registrazione degli Handler e dei Requirement custom viene sempre effettuata allo startup dell\u2019applicazione nel metodo&nbsp;<strong>ConfigureServices<\/strong>.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\npublic void ConfigureServices(IServiceCollection services)\n{\n\u00a0\u00a0services.AddMvc(;\n\u00a0\u00a0services.AddAuthorization(options =&gt;\n\u00a0\u00a0\u00a0\u00a0{\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0options.AddPolicy(&quot;MinYears&quot;, policy =&gt;\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0policy.Requirements.Add(\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0new MinimumYearsInCompanyRequirement(5)));\n\u00a0\u00a0\u00a0\u00a0});\n\u00a0\u00a0services.AddSingleton&lt;IAuthorizationHandler,\n\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0MinimumYearsHandler&gt;();\n}\n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Semplice, espressivo e potente. Dategli una possibilit\u00e0 e non ve ne pentirete.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Al prossimo articolo!<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Vediamo come mettere in sicurezza un\u2019applicazione ASP.NET Core utilizzando le Policy e i Claim<\/p>\n","protected":false},"author":196716246,"featured_media":27483,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_wpcom_ai_launchpad_first_post":false,"_jetpack_feature_clip_id":0,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"{title}\n\n{excerpt}\n\n{url}","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637414,688637382],"class_list":["post-27482","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-asp-net-core","tag-c"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Sicurezza in ASP.NET Core con Policy e Claim - Blexin<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Sicurezza in ASP.NET Core con Policy e Claim - Blexin\" \/>\n<meta property=\"og:description\" content=\"Vediamo come mettere in sicurezza un\u2019applicazione ASP.NET Core utilizzando le Policy e i Claim\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2020-01-28T23:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-01-13T08:40:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1024\" \/>\n\t<meta property=\"og:image:height\" content=\"608\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Francesco de Vicariis\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francesco de Vicariis\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/\"},\"author\":{\"name\":\"Francesco de Vicariis\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6f8514ed8b0d3be31369ca5436c4781f\"},\"headline\":\"Sicurezza in ASP.NET Core con Policy e Claim\",\"datePublished\":\"2020-01-28T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/\"},\"wordCount\":855,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-11.png?fit=1024%2C608&ssl=1\",\"keywords\":[\"Asp.net core\",\"C#\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/\",\"name\":\"Sicurezza in ASP.NET Core con Policy e Claim - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-11.png?fit=1024%2C608&ssl=1\",\"datePublished\":\"2020-01-28T23:00:00+00:00\",\"dateModified\":\"2021-01-13T08:40:16+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6f8514ed8b0d3be31369ca5436c4781f\"},\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-11.png?fit=1024%2C608&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2020\\\/12\\\/image00-11.png?fit=1024%2C608&ssl=1\",\"width\":1024,\"height\":608},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/sicurezza-in-asp-net-core-con-policy-e-claim\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Sicurezza in ASP.NET Core con Policy e Claim\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/6f8514ed8b0d3be31369ca5436c4781f\",\"name\":\"Francesco de Vicariis\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g\",\"caption\":\"Francesco de Vicariis\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/francesco-devicariisblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Sicurezza in ASP.NET Core con Policy e Claim - Blexin","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/","og_locale":"it_IT","og_type":"article","og_title":"Sicurezza in ASP.NET Core con Policy e Claim - Blexin","og_description":"Vediamo come mettere in sicurezza un\u2019applicazione ASP.NET Core utilizzando le Policy e i Claim","og_url":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/","og_site_name":"Blexin","article_published_time":"2020-01-28T23:00:00+00:00","article_modified_time":"2021-01-13T08:40:16+00:00","og_image":[{"width":1024,"height":608,"url":"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1","type":"image\/png"}],"author":"Francesco de Vicariis","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Francesco de Vicariis","Tempo di lettura stimato":"5 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/"},"author":{"name":"Francesco de Vicariis","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6f8514ed8b0d3be31369ca5436c4781f"},"headline":"Sicurezza in ASP.NET Core con Policy e Claim","datePublished":"2020-01-28T23:00:00+00:00","dateModified":"2021-01-13T08:40:16+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/"},"wordCount":855,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1","keywords":["Asp.net core","C#"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/","url":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/","name":"Sicurezza in ASP.NET Core con Policy e Claim - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1","datePublished":"2020-01-28T23:00:00+00:00","dateModified":"2021-01-13T08:40:16+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6f8514ed8b0d3be31369ca5436c4781f"},"breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1","width":1024,"height":608},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/sicurezza-in-asp-net-core-con-policy-e-claim\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Sicurezza in ASP.NET Core con Policy e Claim"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/6f8514ed8b0d3be31369ca5436c4781f","name":"Francesco de Vicariis","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/b3a3164fd0b28d429cd427aafae38a687a41a250a2bccf4ab3b0744138afd64e?s=96&d=identicon&r=g","caption":"Francesco de Vicariis"},"url":"https:\/\/blexin.com\/it\/author\/francesco-devicariisblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2020\/12\/image00-11.png?fit=1024%2C608&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-79g","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27482","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716246"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=27482"}],"version-history":[{"count":7,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27482\/revisions"}],"predecessor-version":[{"id":27825,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/27482\/revisions\/27825"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/27483"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=27482"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=27482"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=27482"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}