【问题标题】:How to pass information from controller which role has been succeed如何从控制器传递信息哪个角色已成功
【发布时间】: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


【解决方案1】:

作为解决方案。我用How to check if user is member of group南宇接受的答案然后:

var prefix = _configuration.GetValue<string>("RolesPrefix");
var isAdmin = User.IsInGroup(prefix + Roles.Admin);
var isRead = User.IsInGroup(prefix + Roles.R);
var isFull = User.IsInGroup(prefix + Roles.F);

这仅适用于 WindowsAuthentication(我正在使用)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-27
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 2017-03-29
    相关资源
    最近更新 更多