gpt4 book ai didi

c# - ThreadStatic 和 ASP.NET

转载 作者:太空宇宙 更新时间:2023-11-03 21:34:31 25 4
gpt4 key购买 nike

我需要通过单独的授权规则列表来保护我的业务对象属性。我希望在各种操作期间暂停我的授权规则,例如转换为 DTO 和执行验证规则(验证当前用户无权查看的属性值)。

我正在研究的方法将调用包装在一个范围对象中,该范围对象使用 [ThreadStatic] 属性来确定是否应运行授权规则:

public class SuspendedAuthorizationScope : IDisposable
{
[ThreadStatic]
public static bool AuthorizationRulesAreSuspended;

public SuspendedAuthorizationScope()
{
AuthorizationRulesAreSuspended = true;
}

public void Dispose()
{
AuthorizationRulesAreSuspended = false;
}
}

这是 IsAuthorized 检查(来自基类):

public bool IsAuthorized(string memberName, AuthorizedAction authorizationAction)
{
if (SuspendedAuthorizationScope.AuthorizationRulesAreSuspended)
return true;

var context = new RulesContext();

_rules.OfType<IAuthorizationRule>()
.Where(r => r.PropertyName == memberName)
.Where(r => r.AuthorizedAction == authorizationAction)
.ToList().ForEach(r => r.Execute(context));

return context.HasNoErrors();
}

下面是演示用法的 ValidateProperty 方法(来自基类):

private void ValidateProperty(string propertyName, IEnumerable<IValidationRule> rules)
{
using (new SuspendedAuthorizationScope())
{
var context = new RulesContext();
rules.ToList().ForEach(rule => rule.Execute(context));
if (HasNoErrors(context))
RemoveErrorsForProperty(propertyName);
else
AddErrorsForProperty(propertyName, context.Results);
}
NotifyErrorsChanged(propertyName);
}

我对范围对象进行了一些测试,表明只要 lambda 在 using 语句的范围内解析,就会使用 SuspendedAuthorizationScope.AuthorizationRulesAreSuspended 的预期/正确值。

这个设计有什么明显的缺陷吗?就线程而言,ASP.NET 中有什么我应该关注的吗?

最佳答案

我发现您提出的方法有两个问题:

  1. 在创建 SuspendedAuthorizationScope 时未能使用 using 将导致保留超出预期范围的开放访问。换句话说,一个容易犯的错误会导致安全漏洞(尤其是在新员工开始挖掘未知代码并错过这种微妙情况时,考虑让您的代码/设计面向 future )。
  2. 将这个魔法标志附加到 ThreadStatic 现在可以通过保留对另一个页面的开放访问的可能性来放大前一个项目符号,因为线程将在完成当前页面后用于处理另一个请求,并且它的授权标志之前没有被重置。因此,现在授权范围的持续时间超过了应有的范围,不仅超出了对 .Dispose() 的缺失调用,而且实际上可能会泄漏到另一个请求/页面和完全不同的用户。

也就是说,我所看到的解决此问题的方法实际上涉及检查授权并标记一个允许稍后绕过的魔术标志,然后将其重置。

建议: 1. 为了至少解决最坏的变体(上面的#2),你能不能把 magic cookie 移动到你的基页面类的成员,并让它有一个只对该页面范围有效而不对其他实例有效的实例字段? 2. 要解决所有情况,是否可以使用 Functor 或类似的方式传递给授权功能,然后在成功授权后将启动运行所有逻辑的 Functor,然后保证清理?请参见下面的伪代码示例:

void myBizLogicFunction()
{
DoActionThatRequiresAuthorization1();
DoActionThatRequiresAuthorization2();
DoActionThatRequiresAuthorization3();
}

void AuthorizeAndRun(string memberName, AuthorizedAction authorizationAction, Func privilegedFunction)
{
if (IsAuthorized(memberName, authorizationAction))
{
try
{
AuthorizationRulesAreSuspended = true;

privilegedFunction();
}
finally
{
AuthorizationRulesAreSuspended = true;
}
}
}

有了上面的内容,我认为它可以是线程静态的,因为 finally 保证运行,因此授权不会泄漏到调用 privilegedFunction 之外。我认为这可行,但可以使用其他人的验证和验证...

关于c# - ThreadStatic 和 ASP.NET,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22432253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com