asp.net 如何检查当前用户是否具有使用控制器操作列表的权限

gr8qqesn  于 2023-05-02  发布在  .NET
关注(0)|答案(1)|浏览(146)

bounty已结束。回答此问题可获得+50声望奖励。赏金宽限期14小时后结束。Imran Qadir Baksh - Baloch希望引起更多关注这个问题。

我有一系列控制器的动作,

AController.BAction
AController.CAction
BController.DAction
BController.EAction
...................

我想用authorizationService.AuthorizeAsync(User,调用授权服务,并传递特定的action和controller,看看用户是否对所有/一些控制器操作有此权限?
为什么我需要这个?因为我有一个指向控制器动作的菜单列表。我只需要检查哪个控制器操作用户有权限,然后才能让它对用户可见。

j8ag8udp

j8ag8udp1#

我尝试了以下基于策略的授权:
IEnumerable<EndpointDataSource>注入控制器(或目标服务)
代码:

var endpoints = _endpointSources.SelectMany(es => es.Endpoints).OfType<RouteEndpoint>();
            // a dictionary records all endpoints require authorization
            var targetdic = new Dictionary<string, string>();
            foreach(var ep in endpoints)
            {

                //read  endpoint's controller name/action name from  ControllerActionDescriptor
                var descriptor = ep.Metadata.OfType<ControllerActionDescriptor>().FirstOrDefault();
                //read httpmethod from HttpMethodMetadata
                var httpmethod=ep.Metadata.OfType<HttpMethodMetadata>().FirstOrDefault()?.HttpMethods.First()??"GET";
                //read authdata
                var authdatalist = ep.Metadata.GetOrderedMetadata<IAuthorizeData>();
                foreach(var authdata in authdatalist)
                {
                    //logical may not correct here,you may need to validate auth scheme?
                    if (authdata.Policy != null&& httpmethod==HttpMethod.Get.Method)
                    {
                        var path = String.Format("/{0}/{1}", descriptor?.ControllerName, descriptor?.ActionName);
                        targetdic.Add(path, authdata.Policy);
                        break;
                    }                    
                }
            }

已尝试以下项目:

详细的控制器和操作:
家庭控制器:

其他控制器:

当我调试时,结果是:

现在你可以试着按照这个doc

@if ((await AuthorizationService.AuthorizeAsync(User, dic["Key"])).Succeeded)
{
    //your link here accroding to  the Key
}

基于abdusco的回答,和这个案子,希望能有所帮助

相关问题