在我的Asp.NET Core WebApi应用程序中,我想为ViewModel中的属性添加权限,然后自定义一个ActionFilter来过滤respone值。如果用户没有权限,则该属性将被回调值替换。现在,我想使用授权策略来检查权限。
如何获取我在Startup.ConfigureServices中添加的所有授权策略?
public void OnActionExecuted(ActionExecutedContext context)
{
if (!(context.Result is JsonResult)) return;
var c = (JsonResult)context.Result;
var pas = c.Value
.GetType().GetTypeInfo()
.GetProperties()
.Where(p => p.GetCustomAttribute<PropertyPermissionAttribute>() != null)
.Select(p =>
{
var attr = p.GetCustomAttribute<PropertyPermissionAttribute>();
return (p, attr);
});
// ** How to Get All Policies ?? **
foreach (var (p, a) in pas)
{
// Check Policies
var cb = a.CallbackValue;
if (cb!=null && p.PropertyType == cb.GetType())
{
p.SetValue(c.Value, cb);
}
else
{
p.SetValue(c.Value, null);
}
}
}
字符串
或者是否有任何其他方式来实现视图模型属性的权限?
2条答案
按热度按时间c6ubokkw1#
我认为这是不可能的。策略存储在私有字段中。See source .但是,我不明白为什么你需要所有的政策?如果将策略的名称存储在
PropertyPermissionAttribute
中,则可以从IAuthorizationPolicyProvider.GetPolicyAsync(string policyName)
获取必要的策略。pprl5pva2#
是的,这是可以做到的,它建立在@Ivan R所说的基础上。我不得不做同样的事情。
首先创建一个具有SecurityStartup类的Console应用程序,该类继承自包含控制器的控制台应用程序中定义的Startup类。但是首先在Startup类中定义一个虚方法,它包含控制器
例如:
字符串
现在在Startup.cs的ConfigureServies方法中调用此方法
例如:
型
您的SecurityStartup类应类似于:
型
使用Endpoint类:
型
现在在你的控制台应用程序中有这样的代码,它基本上迭代了所有的端点,并创建了一个集合,其中包含了你在控制器应用程序中设置的所有授权策略:
例如:
型
用一个方法(我喜欢从STS中为一个经过身份验证的用户获取一个访问令牌,并检查他们是否可以访问每个端点):
型
现在运行这个命令会给予每个端点的集合和所有的Auth内容,包括声明、角色等
我没有包括所有其他类等-但你得到的想法