ZetCode

ASP.NET Authorize

最后修改于 2025 年 4 月 3 日

在本文中,我们将探讨 ASP.NET 8 中的 Authorize 属性。此属性对于通过控制访问来保护 Web 应用程序和 API 至关重要。

ASP.NET 是一个跨平台、高性能的框架,用于构建现代 Web 应用程序。Authorize 属性有助于实现身份验证和授权。

基本定义

ASP.NET 中的 Authorize 属性将控制器或操作的访问权限限制给已认证的用户。它还可以指定必需的角色或策略。

当应用于控制器或操作方法时,Authorize 会检查当前用户是否已认证。如果未认证,则返回 401 Unauthorized 状态码。

Authorize 是 ASP.NET 安全系统的一部分,它与各种身份验证方案集成。它可以与基于 Cookie 的身份验证、JWT 令牌等一起使用。

ASP.NET Authorize 示例

下面的示例演示了一个使用 Authorize 的安全 Web API 控制器。

Program.cs
var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(options =>
    {
        options.TokenValidationParameters = new()
        {
            ValidateIssuer = true,
            ValidateAudience = true,
            ValidateLifetime = true,
            ValidateIssuerSigningKey = true,
            ValidIssuer = builder.Configuration["Jwt:Issuer"],
            ValidAudience = builder.Configuration["Jwt:Audience"],
            IssuerSigningKey = new SymmetricSecurityKey(
                Encoding.UTF8.GetBytes(builder.Configuration["Jwt:Key"]))
        };
    });

builder.Services.AddAuthorization();
builder.Services.AddControllers();

var app = builder.Build();

app.UseAuthentication();
app.UseAuthorization();

app.MapControllers();
app.Run();

这会设置一个具有 JWT bearer 令牌身份验证的 ASP.NET 应用程序。Authorize 属性需要 `UseAuthentication` 和 `UseAuthorization` 中间件才能正常工作。

Controllers/OrdersController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;

[ApiController]
[Route("api/[controller]")]
[Authorize]
public class OrdersController : ControllerBase
{
    private static List<Order> _orders = new()
    {
        new Order(1, "Laptop", 2, 1999.98m),
        new Order(2, "Monitor", 1, 299.99m)
    };

    [HttpGet]
    public IActionResult GetAllOrders()
    {
        return Ok(_orders);
    }

    [HttpGet("{id}")]
    public IActionResult GetOrderById(int id)
    {
        var order = _orders.FirstOrDefault(o => o.Id == id);
        if (order == null) return NotFound();
        return Ok(order);
    }

    [HttpGet("admin")]
    [Authorize(Roles = "Admin")]
    public IActionResult GetAdminData()
    {
        return Ok("This is sensitive admin data");
    }
}

public record Order(int Id, string ProductName, int Quantity, decimal Total);

此控制器演示了三种不同的授权场景。控制器级别的 `[Authorize]` 要求所有操作都必须经过身份验证。

前两个方法对任何已认证的用户都可访问。第三个方法具有额外的 `[Authorize(Roles = "Admin")]` 属性,将访问权限限制给 Admin 角色的用户。

`ApiController` 属性启用了 Web API 约定。`Route` 属性为该控制器中的所有操作设置了基础路径。

此示例展示了 Authorize 如何在不同级别和不同要求下使用。它演示了简单的身份验证检查和基于角色的授权。

来源

Microsoft ASP.NET 授权文档

在本文中,我们探讨了 ASP.NET 8 中的 Authorize 属性。这项强大功能对于保护 Web 应用程序和 API 至关重要。

作者

我叫 Jan Bodnar,是一名充满激情的程序员,拥有丰富的编程经验。我从 2007 年开始撰写编程文章。至今,我已撰写了 1400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出所有 ASP.NET 教程