在ASP.NET Core 3.1中,可以使用属性级授权来保护Web API的特定操作。下面是一个示例解决方案,演示如何在模型属性级别应用授权。
首先,确保你的项目中已经安装了以下NuGet包:
接下来,将以下代码添加到Startup.cs文件的ConfigureServices方法中,以配置身份验证和授权服务:
using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc.Authorization;
public void ConfigureServices(IServiceCollection services)
{
// 添加身份验证服务
services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
.AddJwtBearer(options =>
{
options.TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuer = true,
ValidateAudience = true,
ValidateLifetime = true,
ValidateIssuerSigningKey = true,
ValidIssuer = "YourIssuer",
ValidAudience = "YourAudience",
IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes("YourSecretKey"))
};
});
// 添加授权服务
services.AddAuthorization();
// 添加全局授权策略
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
});
// 添加其他服务
// ...
}
在上面的代码中,你需要替换YourIssuer
、YourAudience
和YourSecretKey
为你自己的值。
然后,在控制器中,你可以使用[Authorize]
属性将整个控制器或特定操作标记为需要授权访问:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Authorize]
[ApiController]
[Route("api/[controller]")]
public class MyController : ControllerBase
{
[HttpGet]
public IActionResult Get()
{
// 返回数据
}
[HttpPost]
[Authorize(Roles = "Admin")]
public IActionResult Post([FromBody] MyModel model)
{
// 只有具有"Admin"角色的用户才能访问此操作
}
}
在上面的代码中,[Authorize(Roles = "Admin")]
属性将Post
操作标记为只允许具有"Admin"角色的用户访问。
最后,你可以在模型属性级别使用[Authorize]
属性来定义特定属性的授权要求:
using System.ComponentModel.DataAnnotations;
using Microsoft.AspNetCore.Authorization;
public class MyModel
{
public int Id { get; set; }
[Authorize(Policy = "RequireEmail")]
public string Email { get; set; }
[Authorize(Roles = "Admin")]
public string Name { get; set; }
}
在上面的代码中,Email
属性要求用户在授权策略"RequireEmail"下才能访问,而Name
属性只允许具有"Admin"角色的用户访问。
通过以上步骤,你可以在ASP.NET Core 3.1 Web API中实现模型属性级别的授权。