13

在我的 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 Local Storage 中是不安全的,因为多个线程可以处理相同的请求,所以我猜它与Thread.CurrentPrincipal相同。或不?

4

1 回答 1

14

我不同意 Jeff Moser 的回答。

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

PrincipalPermissionAttribute
PrincipalPermission.Demand

此外,如果您配置 .NET RoleProvider,它将设置Thread.CurrentPrincipal为与 .NET RoleProvider 相同的主体HttpContext.User

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

至于异步 I/O,这篇博文指出,Thread.CurrentPrincipal文化设置会自动传递给新线程。

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

于 2013-10-30T14:10:23.243 回答