<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>.NET on IAMDevBox</title><link>https://www.iamdevbox.com/tags/.net/</link><description>Recent content in .NET on IAMDevBox</description><image><title>IAMDevBox</title><url>https://www.iamdevbox.com/IAMDevBox.com.jpg</url><link>https://www.iamdevbox.com/IAMDevBox.com.jpg</link></image><generator>Hugo -- 0.146.0</generator><language>en-us</language><lastBuildDate>Sun, 13 Sep 2026 12:04:14 -0400</lastBuildDate><atom:link href="https://www.iamdevbox.com/tags/.net/index.xml" rel="self" type="application/rss+xml"/><item><title>.NET 10: What’s New for Authentication and Authorization</title><link>https://www.iamdevbox.com/posts/net-10-what-s-new-for-authentication-and-authorization/</link><pubDate>Tue, 02 Dec 2025 14:21:27 +0000</pubDate><guid>https://www.iamdevbox.com/posts/net-10-what-s-new-for-authentication-and-authorization/</guid><description>Discover the newest features in .NET 10 for authentication and authorization! Learn how to enhance security and streamline access control in your applications today.</description><content:encoded><![CDATA[<h2 id="why-this-matters-now">Why This Matters Now</h2>
<p>With the increasing complexity of modern web applications, robust and flexible authentication and authorization mechanisms are crucial. The recent release of .NET 10 brings significant enhancements in these areas, making it easier for developers to implement secure and efficient identity management solutions. As of March 2024, these updates address common pain points and provide new features that can streamline your development process and enhance your application&rsquo;s security posture.</p>
<div class="notice danger">🚨 <strong>Security Alert:</strong> Misconfigured authentication can lead to severe vulnerabilities. Ensure you leverage the latest features in .NET 10 to protect your applications.</div>
<h2 id="improved-jwt-handling">Improved JWT Handling</h2>
<p>One of the most notable improvements in .NET 10 is the enhanced support for JSON Web Tokens (JWT). JWTs are widely used for securing APIs and managing user sessions due to their compact size and self-contained nature. The new features make it simpler to validate and generate JWTs, reducing boilerplate code and improving performance.</p>
<h3 id="simplified-jwt-validation">Simplified JWT Validation</h3>
<p>In previous versions of .NET, setting up JWT validation required several steps and boilerplate configuration. With .NET 10, this process has been streamlined. Let&rsquo;s compare the old and new ways:</p>
<h4 id="old-way">Old Way</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddAuthentication(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>    options.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>})
</span></span><span style="display:flex;"><span>.AddJwtBearer(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.TokenValidationParameters = <span style="color:#66d9ef">new</span> TokenValidationParameters
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        ValidateIssuer = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>        ValidateAudience = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>        ValidateLifetime = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>        ValidateIssuerSigningKey = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>        ValidIssuer = Configuration[<span style="color:#e6db74">&#34;Jwt:Issuer&#34;</span>],
</span></span><span style="display:flex;"><span>        ValidAudience = Configuration[<span style="color:#e6db74">&#34;Jwt:Audience&#34;</span>],
</span></span><span style="display:flex;"><span>        IssuerSigningKey = <span style="color:#66d9ef">new</span> SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration[<span style="color:#e6db74">&#34;Jwt:Key&#34;</span>]))
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><h4 id="new-way">New Way</h4>
<p>.NET 10 introduces a more concise and intuitive way to configure JWT validation using the <code>AddJwtBearer</code> method with a simplified options pattern.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
</span></span><span style="display:flex;"><span>    .AddJwtBearer(options =&gt;
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        options.TokenValidationParameters = <span style="color:#66d9ef">new</span> TokenValidationParameters
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            ValidateIssuer = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>            ValidateAudience = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>            ValidateLifetime = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>            ValidateIssuerSigningKey = <span style="color:#66d9ef">true</span>,
</span></span><span style="display:flex;"><span>            ValidIssuer = Configuration[<span style="color:#e6db74">&#34;Jwt:Issuer&#34;</span>],
</span></span><span style="display:flex;"><span>            ValidAudience = Configuration[<span style="color:#e6db74">&#34;Jwt:Audience&#34;</span>],
</span></span><span style="display:flex;"><span>            IssuerSigningKey = <span style="color:#66d9ef">new</span> SymmetricSecurityKey(Encoding.UTF8.GetBytes(Configuration[<span style="color:#e6db74">&#34;Jwt:Key&#34;</span>]))
</span></span><span style="display:flex;"><span>        };
</span></span><span style="display:flex;"><span>    });
</span></span></code></pre></div><div class="key-takeaway">
<h4>🎯 Key Takeaways</h4>
<ul>
<li>Simplified JWT validation setup reduces boilerplate code.</li>
<li>Improved readability and maintainability of authentication configurations.</li>
</ul>
</div>
<h3 id="enhanced-jwt-generation">Enhanced JWT Generation</h3>
<p>Generating JWTs in .NET 10 is also more straightforward. The new <code>SecurityTokenDescriptor</code> class simplifies the creation of tokens.</p>
<h4 id="example">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> tokenHandler = <span style="color:#66d9ef">new</span> JwtSecurityTokenHandler();
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> key = Encoding.ASCII.GetBytes(Configuration[<span style="color:#e6db74">&#34;Jwt:Key&#34;</span>]);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> tokenDescriptor = <span style="color:#66d9ef">new</span> SecurityTokenDescriptor
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    Subject = <span style="color:#66d9ef">new</span> ClaimsIdentity(<span style="color:#66d9ef">new</span> Claim[]
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">new</span> Claim(ClaimTypes.Name, user.Username),
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">new</span> Claim(ClaimTypes.Role, user.Role)
</span></span><span style="display:flex;"><span>    }),
</span></span><span style="display:flex;"><span>    Expires = DateTime.UtcNow.AddDays(<span style="color:#ae81ff">7</span>),
</span></span><span style="display:flex;"><span>    SigningCredentials = <span style="color:#66d9ef">new</span> SigningCredentials(<span style="color:#66d9ef">new</span> SymmetricSecurityKey(key), SecurityAlgorithms.HmacSha256Signature)
</span></span><span style="display:flex;"><span>};
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> token = tokenHandler.CreateToken(tokenDescriptor);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">var</span> tokenString = tokenHandler.WriteToken(token);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">return</span> Ok(<span style="color:#66d9ef">new</span> { Token = tokenString });
</span></span></code></pre></div><div class="notice tip">💜 <strong>Pro Tip:</strong> Always store your secret keys securely and avoid hardcoding them in your source code.</div>
<h2 id="enhanced-openid-connect-support">Enhanced OpenID Connect Support</h2>
<p>OpenID Connect (OIDC) is a protocol built on top of OAuth 2.0 for authentication. It provides a way for applications to verify the identity of a user and obtain basic profile information. .NET 10 offers several enhancements to simplify OIDC integration.</p>
<h3 id="simplified-configuration">Simplified Configuration</h3>
<p>Configuring OIDC in .NET 10 is more intuitive, thanks to the new <code>AddOpenIdConnect</code> method with a streamlined options pattern.</p>
<h4 id="example-1">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddAuthentication(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>})
</span></span><span style="display:flex;"><span>.AddCookie()
</span></span><span style="display:flex;"><span>.AddOpenIdConnect(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.Authority = <span style="color:#e6db74">&#34;https://your-auth-server.com&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientId = <span style="color:#e6db74">&#34;your-client-id&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientSecret = <span style="color:#e6db74">&#34;your-client-secret&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ResponseType = <span style="color:#e6db74">&#34;code&#34;</span>;
</span></span><span style="display:flex;"><span>    options.SaveTokens = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.GetClaimsFromUserInfoEndpoint = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, <span style="color:#e6db74">&#34;sub&#34;</span>);
</span></span><span style="display:flex;"><span>    options.ClaimActions.MapJsonKey(ClaimTypes.Name, <span style="color:#e6db74">&#34;name&#34;</span>);
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><div class="key-takeaway">
<h4>🎯 Key Takeaways</h4>
<ul>
<li>Easier configuration of OpenID Connect providers.</li>
<li>Automatic handling of claims mapping from the user info endpoint.</li>
</ul>
</div>
<h3 id="improved-token-management">Improved Token Management</h3>
<p>.NET 10 includes improvements in token management, such as automatic refresh of access tokens and better handling of token expiration.</p>
<h4 id="example-2">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddAuthentication(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>})
</span></span><span style="display:flex;"><span>.AddCookie()
</span></span><span style="display:flex;"><span>.AddOpenIdConnect(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.Authority = <span style="color:#e6db74">&#34;https://your-auth-server.com&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientId = <span style="color:#e6db74">&#34;your-client-id&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientSecret = <span style="color:#e6db74">&#34;your-client-secret&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ResponseType = <span style="color:#e6db74">&#34;code&#34;</span>;
</span></span><span style="display:flex;"><span>    options.SaveTokens = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.UsePkce = <span style="color:#66d9ef">true</span>; <span style="color:#75715e">// Proof Key for Code Exchange</span>
</span></span><span style="display:flex;"><span>    options.GetClaimsFromUserInfoEndpoint = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, <span style="color:#e6db74">&#34;sub&#34;</span>);
</span></span><span style="display:flex;"><span>    options.ClaimActions.MapJsonKey(ClaimTypes.Name, <span style="color:#e6db74">&#34;name&#34;</span>);
</span></span><span style="display:flex;"><span>    options.Events.OnTokenResponseReceived = <span style="color:#66d9ef">async</span> context =&gt;
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> refreshToken = context.TokenEndpointResponse.RefreshToken;
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Store the refresh token securely</span>
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><div class="notice warning">⚠️ <strong>Warning:</strong> Always handle refresh tokens securely to prevent unauthorized access.</div>
<h2 id="role-based-access-control-rbac-enhancements">Role-Based Access Control (RBAC) Enhancements</h2>
<p>Role-Based Access Control (RBAC) is a widely used method for managing permissions in applications. .NET 10 introduces several enhancements to RBAC, making it easier to define and enforce role-based policies.</p>
<h3 id="policy-based-authorization">Policy-Based Authorization</h3>
<p>Policy-based authorization allows you to define complex authorization logic using policies. .NET 10 simplifies the creation and application of policies.</p>
<h4 id="example-3">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddAuthorization(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.AddPolicy(<span style="color:#e6db74">&#34;CanEdit&#34;</span>, policy =&gt; policy.RequireClaim(ClaimTypes.Role, <span style="color:#e6db74">&#34;Editor&#34;</span>));
</span></span><span style="display:flex;"><span>    options.AddPolicy(<span style="color:#e6db74">&#34;CanDelete&#34;</span>, policy =&gt; policy.RequireClaim(ClaimTypes.Role, <span style="color:#e6db74">&#34;Admin&#34;</span>));
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// In your controller</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">[Authorize(Policy = &#34;CanEdit&#34;)]</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> IActionResult Edit(<span style="color:#66d9ef">int</span> id)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Edit logic here</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> View();
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">
</span></span></span><span style="display:flex;"><span><span style="color:#a6e22e">[Authorize(Policy = &#34;CanDelete&#34;)]</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> IActionResult Delete(<span style="color:#66d9ef">int</span> id)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Delete logic here</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> View();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="key-takeaway">
<h4>🎯 Key Takeaways</h4>
<ul>
<li>Define and enforce complex authorization policies easily.</li>
<li>Separate authorization logic from business logic for cleaner code.</li>
</ul>
</div>
<h3 id="role-based-authorization">Role-Based Authorization</h3>
<p>Role-based authorization is simpler than policy-based but equally powerful for many scenarios. .NET 10 makes it easy to apply roles directly in your controllers.</p>
<h4 id="example-4">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#75715e">// In your controller</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">[Authorize(Roles = &#34;Admin, Editor&#34;)]</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> IActionResult ManageUsers()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Manage users logic here</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> View();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="notice tip">💜 <strong>Pro Tip:</strong> Use role-based authorization for simple scenarios and policy-based for complex ones.</div>
<h2 id="custom-authorization-handlers">Custom Authorization Handlers</h2>
<p>For more advanced authorization scenarios, .NET 10 allows you to create custom authorization handlers. This feature provides flexibility to implement custom authorization logic.</p>
<h3 id="example-5">Example</h3>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">CustomAuthorizationRequirement</span> : IAuthorizationRequirement
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> <span style="color:#66d9ef">string</span> Permission { <span style="color:#66d9ef">get</span>; }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">public</span> CustomAuthorizationRequirement(<span style="color:#66d9ef">string</span> permission)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        Permission = permission;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> <span style="color:#66d9ef">class</span> <span style="color:#a6e22e">CustomAuthorizationHandler</span> : AuthorizationHandler&lt;CustomAuthorizationRequirement&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">protected</span> <span style="color:#66d9ef">override</span> Task HandleRequirementAsync(AuthorizationHandlerContext context, CustomAuthorizationRequirement requirement)
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> userPermission = context.User.FindFirstValue(<span style="color:#e6db74">&#34;Permission&#34;</span>);
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">if</span> (userPermission == requirement.Permission)
</span></span><span style="display:flex;"><span>        {
</span></span><span style="display:flex;"><span>            context.Succeed(requirement);
</span></span><span style="display:flex;"><span>        }
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">return</span> Task.CompletedTask;
</span></span><span style="display:flex;"><span>    }
</span></span><span style="display:flex;"><span>}
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Register the handler</span>
</span></span><span style="display:flex;"><span>services.AddSingleton&lt;IAuthorizationHandler, CustomAuthorizationHandler&gt;();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Define the policy</span>
</span></span><span style="display:flex;"><span>services.AddAuthorization(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.AddPolicy(<span style="color:#e6db74">&#34;CustomPermission&#34;</span>, policy =&gt; policy.Requirements.Add(<span style="color:#66d9ef">new</span> CustomAuthorizationRequirement(<span style="color:#e6db74">&#34;Edit&#34;</span>)));
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// Apply the policy</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">[Authorize(Policy = &#34;CustomPermission&#34;)]</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> IActionResult CustomAction()
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Custom action logic here</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> View();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="key-takeaway">
<h4>🎯 Key Takeaways</h4>
<ul>
<li>Create custom authorization handlers for advanced scenarios.</li>
<li>Implement complex authorization logic tailored to your application's needs.</li>
</ul>
</div>
<h2 id="security-improvements">Security Improvements</h2>
<p>Security is paramount in any application, and .NET 10 includes several security improvements related to authentication and authorization.</p>
<h3 id="secure-token-storage">Secure Token Storage</h3>
<p>Storing tokens securely is crucial to prevent unauthorized access. .NET 10 provides built-in support for secure storage of tokens using data protection APIs.</p>
<h4 id="example-6">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddDataProtection()
</span></span><span style="display:flex;"><span>    .PersistKeysToFileSystem(<span style="color:#66d9ef">new</span> DirectoryInfo(<span style="color:#e6db74">@&#34;\\server\keys\&#34;</span>))
</span></span><span style="display:flex;"><span>    .ProtectKeysWithDpapi();
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>services.AddAuthentication(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>    options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
</span></span><span style="display:flex;"><span>})
</span></span><span style="display:flex;"><span>.AddCookie()
</span></span><span style="display:flex;"><span>.AddOpenIdConnect(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.Authority = <span style="color:#e6db74">&#34;https://your-auth-server.com&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientId = <span style="color:#e6db74">&#34;your-client-id&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ClientSecret = <span style="color:#e6db74">&#34;your-client-secret&#34;</span>;
</span></span><span style="display:flex;"><span>    options.ResponseType = <span style="color:#e6db74">&#34;code&#34;</span>;
</span></span><span style="display:flex;"><span>    options.SaveTokens = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.UsePkce = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.GetClaimsFromUserInfoEndpoint = <span style="color:#66d9ef">true</span>;
</span></span><span style="display:flex;"><span>    options.ClaimActions.MapJsonKey(ClaimTypes.NameIdentifier, <span style="color:#e6db74">&#34;sub&#34;</span>);
</span></span><span style="display:flex;"><span>    options.ClaimActions.MapJsonKey(ClaimTypes.Name, <span style="color:#e6db74">&#34;name&#34;</span>);
</span></span><span style="display:flex;"><span>    options.Events.OnTokenResponseReceived = <span style="color:#66d9ef">async</span> context =&gt;
</span></span><span style="display:flex;"><span>    {
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> refreshToken = context.TokenEndpointResponse.RefreshToken;
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Store the refresh token securely using data protection</span>
</span></span><span style="display:flex;"><span>        <span style="color:#66d9ef">var</span> protectedToken = context.HttpContext.Protect(refreshToken);
</span></span><span style="display:flex;"><span>        <span style="color:#75715e">// Save the protected token to your storage</span>
</span></span><span style="display:flex;"><span>    };
</span></span><span style="display:flex;"><span>});
</span></span></code></pre></div><div class="notice danger">🚨 <strong>Security Alert:</strong> Always protect sensitive data, such as tokens, using data protection APIs.</div>
<h3 id="cross-site-request-forgery-csrf-protection">Cross-Site Request Forgery (CSRF) Protection</h3>
<p>Cross-Site Request Forgery (CSRF) attacks can be mitigated by enabling CSRF protection in .NET 10. This feature ensures that only requests from trusted sources are processed.</p>
<h4 id="example-7">Example</h4>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-csharp" data-lang="csharp"><span style="display:flex;"><span>services.AddAntiforgery(options =&gt;
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    options.HeaderName = <span style="color:#e6db74">&#34;X-CSRF-TOKEN&#34;</span>;
</span></span><span style="display:flex;"><span>});
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e">// In your controller</span>
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">[ValidateAntiForgeryToken]</span>
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">public</span> IActionResult SubmitForm(MyModel model)
</span></span><span style="display:flex;"><span>{
</span></span><span style="display:flex;"><span>    <span style="color:#75715e">// Form submission logic here</span>
</span></span><span style="display:flex;"><span>    <span style="color:#66d9ef">return</span> View();
</span></span><span style="display:flex;"><span>}
</span></span></code></pre></div><div class="notice tip">💜 <strong>Pro Tip:</strong> Always enable CSRF protection to prevent malicious requests.</div>
<h2 id="conclusion">Conclusion</h2>
<p>.NET 10 brings significant enhancements to authentication and authorization, making it easier to build secure and efficient applications. From improved JWT handling to enhanced OpenID Connect support, these updates address common pain points and provide new features that can streamline your development process. By leveraging these new capabilities, you can ensure that your applications are secure and scalable.</p>
<div class="notice success">✅ <strong>Best Practice:</strong> Stay updated with the latest .NET releases to take advantage of new security features and improvements.</div>]]></content:encoded></item></channel></rss>