我正在开发一个允许用户按其角色访问的应用程序。这是通过控制器级别的数据注释配置的。
[Authorize(Roles = ("Super user,Admin"))]
[Route("api/[controller]")]
[ApiController]
public class UsersController: ControllerBase
{
}
这与我的Angular前端完美配合。
这里的问题是我只想对授权批注中不允许的用户启用一种get方法。
方法是:
[HttpGet("{id}")]
public async Task<IActionResult> GetUser(int id)
我想允许访问名为“基本用户”的用户吗?
有什么想法吗?
致意,非常感谢您的支持
编辑:
我发现如果我做控制器:
[Authorize(Roles = ("Basic user,Super user,Admin"))]
[Route("api/[controller]")]
[ApiController]
public class UsersController: ControllerBase
{
}
我可以将其他端点指定为:
[Authorize(Roles = ("Super user,Admin"))]
它们受到保护,而并非我想要的完全。
答案 0 :(得分:2)
有两种实现目标的有趣方法:
方法A。 扩展Authorize
类
internal class MinimumAgeAuthorizeAttribute : AuthorizeAttribute
{
const string POLICY_PREFIX = "MinimumAge";
public MinimumAgeAuthorizeAttribute(int age) => Age = age;
// Get or set the Age property by manipulating the underlying Policy property
public int Age
{
get
{
if (int.TryParse(Policy.Substring(POLICY_PREFIX.Length), out var age))
{
return age;
}
return default(int);
}
set
{
Policy = $"{POLICY_PREFIX}{value.ToString()}";
}
}
}
用法:
[MinimumAgeAuthorize(10)]
public IActionResult RequiresMinimumAge10()
方法B。 创建策略并使用[Authorize]属性设置“策略” [Authorize(Policy = "CustomPolicy")]
public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();
services.AddAuthorization(options =>
{
options.AddPolicy("AtLeast21", policy =>
policy.Requirements.Add(new MinimumAgeRequirement(21)));
});
}
用法:
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
[Authorize(Policy = "AtLeast21")]
public class AlcoholPurchaseController : Controller
{
public IActionResult Login() => View();
public IActionResult Logout() => View();
}
答案 1 :(得分:0)
您可以将Authorize属性(而不是类)放在控制器的每个方法上。然后,您可以分别控制每种方法的授权。
仅将[Authorize]
放在GetUser
方法上,以便任何用户都可以调用它。以及[Authorize(Roles = ("Super user,Admin"))]
到控制器中的所有其他方法。
答案 2 :(得分:0)
如果您真的不想拆分一个类或将所有属性都放在所有内容上,另一种选择是允许所有人使用该方法,然后自己执行检查。
[HttpGet("{id}")]
[AllowAnonymous]
public async Task<IActionResult> GetUser(int id)
{
if(!User.IsInRole("Super user") && !User.IsInRole("Admin") && User.Identity.Name != "Basic User")
{
return Unauthorized
}
Logic from before
}