ASP.NET Core 中间件
中间件
前置知识
-
请求管道
假设我们有一个虚拟的链路:A->B->C->D->E ,我要把数据发送给E,需要经过 A->B->C->D 这四个节点,那么 A,B,C,D 就是我发起请求的这个过程中的中间件,从 A 到 E 就可以抽象为一个请求管道。 -
终结点(Endpoint)
我们上诉的例子中,发送数据给 E 后,然后数据由 E->D->C->B->A 返回给我们,此时 E 是我们最后经过的一个节点,我们把这个节点叫做终结点。
当然,如果我们只请求到 C 就返回了结果,此时不需要执行到 E,那么这个过程被称为 “请求管道短路”,就是在 C 这个节点这里短路直接返回了。 -
概述
综上所述,我们的请求管道,就类似一个 U 型管 模型。
中间件顺序
-
ExceptionHandler 异常处理中间件
-
HSTS
HSTS(HTTP Strict Transport Security)中间件是ASP.NET Core中的一个安全中间件,用于通过强制使用HTTPS提供更强大的安全性。
HSTS是一种安全策略,它通过向浏览器发送特殊的HTTP响应头告知浏览器,在未来的一段时间内,该网站只能通过HTTPS进行访问,而不是通过不安全的HTTP协议。这样可以防止中间人攻击、数据窃听以及其他可能的安全威胁。
在ASP.NET Core中,您可以通过在Startup.cs文件的Configure方法中添加以下代码来启用HSTS中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other middleware configurations
app.UseHsts();
// Other middleware configurations
}
当HSTS中间件启用时,它将自动在HTTP响应中添加Strict-Transport-Security头。此头指示浏览器在后续请求中始终使用HTTPS。
您还可以通过在UseHsts方法中传递HstsOptions对象来配置HSTS中间件的行为。例如,您可以设置最大的HSTS时间以及是否包含子域名。
HSTS中间件对于那些要确保其网站始终通过HTTPS进行访问的ASP.NET Core应用程序非常有用。它提供了一层额外的安全保护,可以帮助防止恶意攻击和数据泄露。
- HttpsRedirection
HttpsRedirection中间件是ASP.NET Core中的一个安全中间件,用于将HTTP请求重定向到HTTPS,以确保通信是通过安全的加密连接进行的。
当HttpsRedirection中间件启用时,它会检查每个传入的请求,如果请求是通过HTTP协议进行的,中间件将自动将请求重定向到对应的HTTPS地址。
要启用HttpsRedirection中间件,请在Startup.cs文件的Configure方法中添加以下代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other middleware configurations
app.UseHttpsRedirection();
// Other middleware configurations
}
通过启用HttpsRedirection中间件,您可以强制要求所有的HTTP请求通过HTTPS进行通信。这对于确保应用程序及其数据始终受到加密保护非常重要,防止敏感信息在传输过程中被窃听或篡改。
需要注意的是,为了使用HttpsRedirection中间件,您的应用程序必须可用的SSL证书。否则,重定向将无法生效。
HttpsRedirection中间件对于那些希望通过HTTPS保护其应用程序的ASP.NET Core项目非常有用。它提供了一种简单和方便的方式来确保所有的通信都是通过安全的HTTPS协议进行的,提高应用程序的安全性。
- Static Files
Static Files 中间件是ASP.NET Core中的一个中间件,用于提供对静态文件的服务,例如HTML、CSS、JavaScript、图像等。静态文件通常是不需要在服务器上进行处理的文件,它们可以直接通过HTTP协议传输给客户端,提高应用程序的性能和效率。
要启用Static Files 中间件,请在Startup.cs文件的Configure方法中添加以下代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other middleware configurations
app.UseStaticFiles();
// Other middleware configurations
}
通过启用Static Files 中间件,您的应用程序就能够直接服务于wwwroot目录下的静态文件。默认情况下,wwwroot是ASP.NET Core项目的默认静态文件目录,您可以在项目根目录下创建该目录,并将您的静态文件放置在其中。
Static Files 中间件提供了对常见静态文件的服务,例如.css、.js、.png等。当客户端请求这些文件时,中间件会自动将它们返回给客户端,而无需进一步处理。
这对于在ASP.NET Core应用程序中托管前端资源以及其他静态内容非常有用。使用Static Files 中间件可以方便地为应用程序添加样式、脚本和图像等静态资源。
- Routing
Routing 中间件是ASP.NET Core中的一个关键中间件,用于处理传入的HTTP请求并将其路由到相应的处理程序(Controller的Action)。
在ASP.NET Core中,路由是通过控制器和动作(方法)来定义的。Routing 中间件通过检查请求的URL,并根据路由规则将请求路由到匹配的控制器和动作。这样,它能够确定如何处理特定的HTTP请求。
要启用Routing中间件,请在Startup.cs文件的Configure方法中添加以下代码:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other middleware configurations
app.UseRouting();
// Other middleware configurations
}
在启用Routing中间件后,通常会添加其他中间件,例如Endpoint 中间件,以定义路由规则。例如:
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "default",
pattern: "{controller=Home}/{action=Index}/{id?}");
});
上述代码中,MapControllerRoute方法定义了一个默认的路由规则,指定了控制器、动作和可选的参数。这样,如果请求的URL与这个模式匹配,Routing中间件就能够将请求路由到相应的控制器和动作。
Routing 中间件对于ASP.NET Core应用程序的正常运作至关重要,它使开发者能够定义清晰的URL结构,并将请求映射到相应的处理程序,从而实现灵活的路由和控制。
- CORS
CORS(跨域资源共享)中间件是ASP.NET Core中的一个中间件,用于处理跨域资源访问。跨域访问是指在浏览器端,通过JavaScript代码从一个域名的网页去请求另一个域名的资源(例如API接口)。
默认情况下,浏览器实施同源策略,即只允许来自相同域的请求。但在某些情况下,您可能需要允许来自不同域的请求访问您的应用程序的资源。CORS中间件提供了一种简单方便的方式来配置并处理这些跨域请求。
要启用CORS中间件,请在Startup.cs文件的ConfigureServices方法中进行配置,添加以下代码:
public void ConfigureServices(IServiceCollection services)
{
// Other service configurations
services.AddCors();
// Other service configurations
}
然后,在Configure方法中使用UseCors方法来启用CORS中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other middleware configurations
app.UseCors();
// Other middleware configurations
}
默认情况下,CORS中间件会允许来自任何来源的请求。但这可能是不安全的,因此通常建议通过配置进行更精细的控制。
您可以在ConfigureServices方法中使用AddCors方法设置CORS规则,并指定允许访问的来源、允许的HTTP方法和其他自定义选项。例如:
public void ConfigureServices(IServiceCollection services)
{
// Other service configurations
services.AddCors(options =>
{
options.AddPolicy("MyPolicy",
builder =>
{
builder.WithOrigins("http://example.com")
.AllowAnyMethod()
.AllowAnyHeader();
});
});
// Other service configurations
}
上述代码中,我们创建了一个名为"MyPolicy"的CORS策略,允许来源为"http://example.com"的请求,并允许任何HTTP方法和头部。
CORS中间件对于允许其他域的请求访问您的应用程序资源非常有用。使用CORS中间件,您可以灵活地配置、控制和管理跨域资源共享。
- Authentication
Authentication(身份验证)中间件是ASP.NET Core中的一个关键中间件,用于处理用户身份验证和授权。
在 web 应用程序中,Authentication 中间件负责验证用户的身份,并提供访问权限的控制。它通过检查传入的请求的凭据(例如用户名和密码、令牌等),并与存储在应用程序中的用户凭据进行验证。验证成功后,Authentication 中间件会为用户生成一个身份标识,并在后续请求中使用该标识来识别用户。
要使用 Authentication 中间件,首先需要选择和配置适当的身份验证方案。ASP.NET Core 提供了多种身份验证方案,包括Cookie 身份验证、JWT 身份验证、OpenID Connect 身份验证等等。您可以根据应用程序的需求进行选择和配置。
在Startup.cs文件的ConfigureServices方法中,需要进行身份验证服务的配置。例如,对于Cookie 身份验证方案,可以添加以下代码:
public void ConfigureServices(IServiceCollection services)
{
// Other service configurations
services.AddAuthentication("MyCookieScheme")
.AddCookie("MyCookieScheme", options =>
{
// Configure cookie options
});
// Other service configurations
}
然后,在Startup.cs文件的Configure方法中,使用UseAuthentication方法启用身份验证中间件:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
// Other middleware configurations
app.UseAuthentication();
// Other middleware configurations
}
通过启用 Authentication 中间件,您的应用程序就能够在需要进行身份验证和授权的地方对用户进行验证,并根据结果提供相应的服务或拒绝访问。
Authentication 中间件对于保护应用程序资源、授权访问并确保只有经过身份验证用户才能访问敏感数据非常有用。它使开发者能够轻松地集成和管理用户身份验证和授权功能。
- Authorization
在ASP.NET Core中,Authorization中间件负责处理身份验证和授权。它的主要作用是确保用户已经通过身份验证,并且拥有执行请求所需的适当授权。这个中间件在请求处理管道的早期阶段运行,通常在路由中间件之后但在终端处理程序之前。
具体而言,Authorization中间件执行以下主要任务:
-
身份验证(Authentication): 验证用户的身份,确保用户是谁他们声称的。这可能涉及用户名和密码的验证、令牌验证等。
-
授权(Authorization): 确定用户是否具有执行请求操作的权限。授权可以基于用户的角色、声明或其他自定义策略。
-
处理拒绝访问: 如果用户未经授权,
Authorization中间件将拒绝请求,并根据情况返回适当的 HTTP 状态码(通常是 401 未授权或 403 禁止访问)。
在ASP.NET Core中,Authorization中间件通常与身份验证方案(authentication schemes)、策略(policies)和声明(claims)一起使用,以定义在请求中执行的身份验证和授权规则。可以通过在控制器或操作方法上应用[Authorize]特性来指定需要授权的资源,或者使用[AllowAnonymous]特性排除某些资源。
总的来说,Authorization中间件是ASP.NET Core中确保请求安全性的一个重要组件,它帮助开发人员轻松地实现身份验证和授权机制。
- 综上所述
通常中间件执行的顺序为 ExceptionHandler->HSTS->HttpsRedirection->StaticFiles->Routing->CORS->Authentication->Authorzation->自定义中间件。
.net 内置的中间件:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?view=aspnetcore-7.0
自定义中间件
通常,中间件封装在类中,并且通过扩展方法公开。 请考虑以下内联中间件,该中间件通过查询字符串设置当前请求的区域性:
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpsRedirection();
// 这是内联中间件写法。
app.Use(async (context, next) =>
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline.
await next(context);
});
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"CurrentCulture.DisplayName: {CultureInfo.CurrentCulture.DisplayName}");
});
app.Run();
以上突出显示的内联中间件用于演示通过调用 Microsoft.AspNetCore.Builder.UseExtensions.Use 创建中间件组件。
以上 Use 扩展方法将内联定义的中间件委托添加到应用程序的请求管道。
Use 扩展可以使用两个重载:
一个重载采用 HttpContext 和 Func<Task>。 不使用任何参数调用 Func<Task>。
另一个重载采用 HttpContext 和 RequestDelegate。 通过传递 HttpContext 调用 RequestDelegate。
以下代码将中间件委托移动到类:
using System.Globalization;
namespace Middleware.Example;
public class RequestCultureMiddleware
{
private readonly RequestDelegate _next;
public RequestCultureMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task InvokeAsync(HttpContext context)
{
var cultureQuery = context.Request.Query["culture"];
if (!string.IsNullOrWhiteSpace(cultureQuery))
{
var culture = new CultureInfo(cultureQuery);
CultureInfo.CurrentCulture = culture;
CultureInfo.CurrentUICulture = culture;
}
// Call the next delegate/middleware in the pipeline.
await _next(context);
}
}
// 通常,创建扩展方法以通过 IApplicationBuilder 公开中间件:
public static class RequestCultureMiddlewareExtensions
{
public static IApplicationBuilder UseRequestCulture(
this IApplicationBuilder builder)
{
return builder.UseMiddleware<RequestCultureMiddleware>();
}
}
中间件类必须包括:
- 具有类型为 RequestDelegate 的参数的公共构造函数。
- 名为 Invoke 或 InvokeAsync 的公共方法。 此方法必须:
- 返回 Task。
- 接受类型 HttpContext 的第一个参数。
以下代码通过 Program.cs 调用中间件:
using Middleware.Example;
using System.Globalization;
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.UseHttpsRedirection();
app.UseRequestCulture();
app.Run(async (context) =>
{
await context.Response.WriteAsync(
$"CurrentCulture.DisplayName: {CultureInfo.CurrentCulture.DisplayName}");
});
app.Run();
浙公网安备 33010602011771号