ASP.NET AllowAnonymous
最后修改于 2025 年 4 月 3 日
在本文中,我们将探讨 ASP.NET 8 中的 AllowAnonymous 属性。此属性可以绕过特定控制器操作的授权要求。
ASP.NET 提供了强大的身份验证和授权功能。当您需要使某些端点在无需身份验证的情况下可访问时,可以使用 AllowAnonymous。
基本定义
ASP.NET 中的 AllowAnonymous 属性表示控制器或操作方法应跳过授权检查。它会覆盖任何授权策略。
当应用于控制器或操作时,即使控制器或应用程序需要身份验证,它也允许匿名访问。这对于登录页面等公共端点很有用。
AllowAnonymous 是 ASP.NET 授权系统的一部分。它适用于 .NET 8 应用程序中的传统和基于属性的授权方法。
ASP.NET AllowAnonymous 示例
以下示例演示了在 Web API 控制器中使用 AllowAnonymous。
Program.cs
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
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.AddControllers();
var app = builder.Build();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();
这会为应用程序设置 JWT bearer 身份验证。身份验证中间件在授权之前添加,以确保请求得到正确处理。
Controllers/AuthController.cs
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.IdentityModel.Tokens.Jwt;
using System.Security.Claims;
using Microsoft.IdentityModel.Tokens;
[ApiController]
[Route("api/[controller]")]
public class AuthController : ControllerBase
{
private readonly IConfiguration _config;
public AuthController(IConfiguration config)
{
_config = config;
}
[AllowAnonymous]
[HttpPost("login")]
public IActionResult Login([FromBody] LoginModel login)
{
// In a real app, validate credentials against database
if (login.Username != "admin" || login.Password != "password")
return Unauthorized();
var token = GenerateJwtToken(login.Username);
return Ok(new { Token = token });
}
[Authorize]
[HttpGet("profile")]
public IActionResult GetProfile()
{
var username = User.Identity.Name;
return Ok(new { Username = username, Message = "Secure data" });
}
private string GenerateJwtToken(string username)
{
var claims = new[]
{
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Role, "User")
};
var key = new SymmetricSecurityKey(
Encoding.UTF8.GetBytes(_config["Jwt:Key"]));
var creds = new SigningCredentials(key, SecurityAlgorithms.HmacSha256);
var token = new JwtSecurityToken(
issuer: _config["Jwt:Issuer"],
audience: _config["Jwt:Audience"],
claims: claims,
expires: DateTime.Now.AddMinutes(30),
signingCredentials: creds);
return new JwtSecurityTokenHandler().WriteToken(token);
}
}
public record LoginModel(string Username, string Password);
此控制器显示两个端点:一个公共登录端点和一个安全的配置文件端点。登录端点标记有 AllowAnonymous,以允许未经身份验证的访问。
Login 操作在验证凭据后生成 JWT 令牌。GetProfile 操作需要身份验证,如 Authorize 属性所示。
该示例演示了如何将 AllowAnonymous 与同一控制器中的 Authorize 一起使用。这种模式对于与身份验证相关的端点很常见。
来源
在本文中,我们探讨了 ASP.NET 8 中的 AllowAnonymous 属性。此重要功能可在 Web 应用程序中实现灵活的授权配置。