【发布时间】:2021-12-29 10:58:51
【问题描述】:
我正在使用 .NET Core 和 Vue.JS
我想知道在我看来是通过哪个角色验证用户
我现在拥有的
控制器
[Authorize(Roles = Roles.R)]
[Authorize(Roles = Roles.F)]
[Authorize(Roles = Roles.Admin)]
public IActionResult Index()
{
return View();
}
[HttpGet]
[Route("IsAdmin")]
[Authorize(Roles = Roles.Admin)]
public IActionResult IsAdmin()
{
return Ok(true);
}
[HttpGet]
[Route("IsFull")]
[Authorize(Roles = Roles.F)]
public IActionResult IsFull()
{
return Ok(true);
}
[HttpGet]
[Route("IsRead")]
[Authorize(Roles = Roles.R)]
public IActionResult IsRead()
{
return Ok(true);
}
查看
let vm = this;
jQuery.ajax({
url: '/IsAdmin',
type: "GET",
success: function (result) {
vm.isAdmin = true;
},
error: function (result) {
},
async: false
});
jQuery.ajax({
url: '/IsFull',
type: "GET",
success: function (result) {
vm.isFull = true;
},
error: function (result) {
},
async: false
});
jQuery.ajax({
url: '/IsRead',
type: "GET",
success: function (result) {
vm.isRead = true;
},
error: function (result) {
},
async: false
});
我知道这看起来很糟糕,而且可能是很糟糕的方法,但我没有更好的主意。
我补充。为了处理角色,我使用自定义AuthorizationHandler,因为我需要从配置中组合RolesPrefix。
自定义授权处理程序
public Task HandleAsync(AuthorizationHandlerContext authContext)
{
var succeed = false;
var pendingRequirements = authContext.PendingRequirements.ToList();
var requiredRoles = new List<RoleRequirement>();
foreach (var requirement in pendingRequirements)
{
requiredRoles.AddRange(((RolesAuthorizationRequirement)requirement).AllowedRoles.Select(x => new RoleRequirement(x)).ToList());
}
foreach (var role in requiredRoles)
{
if (role is RoleRequirement requirement)
{
var prefix = _configuration.GetValue<string>("RolesPrefix");
if (authContext.User.IsInRole(prefix + requirement.Role))
{
succeed = true;
}
}
};
if (succeed)
{
MakeRequirementsSucceed(authContext);
}
return Task.CompletedTask;
}
private static void MakeRequirementsSucceed(AuthorizationHandlerContext authContext)
{
authContext.PendingRequirements.ToList().ForEach(x => authContext.Succeed(x));
}
我认为会更好
[Authorize(Roles = Roles.R)]
[Authorize(Roles = Roles.F)]
[Authorize(Roles = Roles.Admin)]
public IActionResult Index()
{
var prefix = GetPrefixFromConfig();
var isAdmin = User.IsInRole(prefix + Roles.Admin);
var isFull = User.IsInRole(prefix + Roles.F);
var isRead = User.IsInRole(prefix + Roles.R);
return View(new { isAdmin, isFull, isRead });
}
由于IsInRole 方法由于某种原因总是返回null,显然提供的示例(伪编码)不起作用。
您能否向我展示并解释此问题的更好解决方案?非常感谢您的回答
【问题讨论】:
-
您的自定义 AuthorizationHandler 看起来如何?要使 IsInRole 方法正常工作,您需要将角色作为声明添加到 ClaimsPrincipal
-
@fbede 我添加了您要求的代码。您能否提供一个您正在谈论的示例代码?
标签: c# .net-core controller authorization