c# - 如何在一个地方为所有 Controller 验证 Request.Headers ["Authorization"]?

标签 c# asp.net-core .net-core

[HttpGet]
public IActionResult Get()
{
    string token = Request.Headers["Authorization"];
    // Validate token.
}

[HttpPost]
public IActionResult Post(int id)
{
    string token = Request.Headers["Authorization"];
    // Validate token.
}

如何在一个地方为所有 Controller 验证 Request.Headers["Authorization"]?

最佳答案

您可以创建和使用自定义中间件,您可以在其中检查 header 并验证它是否应该传递给 Controller ​​。

为了实现创建中间件类并将其注册到 Startup.cs 中,如下所示:

public void Configure(IApplicationBuilder app, IHostingEnvironment env, IConnectionManager conn, ILoggerFactory loggerFactory)
{
    app.UseMiddleware<YourMidllewareClass>();
}

在中间件类中创建 Invoke 方法。在每个请求跳转到您的任何 Controller 之前,将调用此方法。

public async Task Invoke(HttpContext context)
{
    string token = context.Request.Headers["Authorization"];

    //do the checking
    if (token == null)
    {
        context.Response.StatusCode = 401; 
        await context.Response.WriteAsync("Access denied!");
        return;
    }

    //pass request further if correct
    await _next(context);
}

据我所知,您必须在 UseMvc() 方法之前注册您的中间件,以确保您的 Invoke() 将在 Mvc 管道之前被调用。

关于c# - 如何在一个地方为所有 Controller 验证 Request.Headers ["Authorization"]?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45494937/

相关文章:

c# - 反序列化动态对象

c# - 列表中的项目计数未按预期工作

c# - 获取加载程序集的根命名空间(程序集命名空间)

c# - ASP.NET Core 如何判断 MIME 类型并应用不同的中间件?

c# - ASP.NET Core JWT 将角色声明映射到 ClaimsIdentity

c# - Razor:自定义 BeginForm()-like Razor 一次性 block 在某些情况下不起作用

c# - Rotativa 无法在空引用 asp.net core 上执行运行时绑定(bind)

asp.net - Web.Api 未在 Post 中反序列化子数组的属性

angular - Asp.net Core spa + angular4 + firebase

asp.net - 如何创建基于 .NET Core 而不是完整框架的 ASP.NET 项目?