【问题标题】:Thread.CurrentPrincipal.Identity in ASP .NET - is it safe to useASP .NET 中的 Thread.CurrentPrincipal.Identity - 使用安全吗
【发布时间】:2013-11-10 02:35:46
【问题描述】:

在我的 AuthenticateRequest 事件处理程序中,我设置了 Thread 的主体。这是我的 IHttpModule 的一部分:

    public void Init(HttpApplication context)
    {
        context.AuthenticateRequest += AuthenticateRequest;
    }

    private void AuthenticateRequest(object sender, EventArgs e)
    {
        var principal = CreatePrincipal();
        HttpContext.Current.User = principal;
    }

但是我有一个程序集,它不应该访问 System.Web,所以我不能使用 HttpContext.Current.User,但我需要访问当前主体。我的第一个想法是将我的方法更改为:

System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User = principal;

并在需要时使用 Thread.CurrentPrincipal。

但据我所知,将请求特定的内容存储在线程本地存储中是不安全的,因为多个线程可以处理同一个请求,所以我想 Thread.CurrentPrincipal 也是如此。还是不行?

【问题讨论】:

  • 听起来您可以更改程序集 - 是否无法将它需要处理的主体传递给它?
  • 最近在类似的情况下,我只是强制调用者提供主体对象。
  • 这就是我要做的——注入主体。无论如何,我希望有更好的方法

标签: asp.net .net httpcontext


【解决方案1】:

我不同意 Jeff Moser 的回答。

标准的 .NET 授权都使用 Thread.CurrentPrincipal 工作。例如:

PrincipalPermissionAttribute
PrincipalPermission.Demand

另外,如果你配置一个 .NET RoleProvider,它会将Thread.CurrentPrincipal 设置为与HttpContext.User 相同的主体。

因此,这是执行此操作的标准方法,我会在您的自定义身份验证代码中执行相同的操作(甚至更好 - 将其实现为自定义 RoleProvider)。

对于异步 I/O,this blog post 声明 Thread.CurrentPrincipal 和区域性设置会自动传递给新线程。

如果您的库将主体用于授权目的,使用Thread.CurrentPrincipal 可以说更安全,因为不受信任的代码可以将主体作为参数传递,而 CAS 可能会阻止它设置Thread.CurrentPrincipal

【讨论】:

  • 感谢您的链接!我没有意识到 ASP.NET 为您做到了这一点。我会删除我的答案。
  • 其实这是有道理的。我在整个应用程序中使用 PrincipalPermission 等授权属性,显然这些属性在幕后使用 Thread.CurrentPrincipal。非常感谢!
猜你喜欢
  • 1970-01-01
  • 2016-07-28
  • 1970-01-01
  • 1970-01-01
  • 2016-03-23
  • 1970-01-01
  • 2012-06-16
  • 2014-09-06
  • 2023-03-11
相关资源
最近更新 更多