dra*_*fly 12 .net asp.net httpcontext
在我的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;
}
Run Code Online (Sandbox Code Playgroud)
但我有一个程序集,不应该访问System.Web,所以我不能使用HttpContext.Current.User,但我需要访问当前主体.我的第一个想法是将我的方法改为:
System.Threading.Thread.CurrentPrincipal = HttpContext.Current.User = principal;
Run Code Online (Sandbox Code Playgroud)
并在需要时使用Thread.CurrentPrincipal.
但据我记得,在线程本地存储中存储请求特定内容是不安全的,因为多个线程可以处理相同的请求,所以我猜它与Thread.CurrentPrincipal相同.或不?
Joe*_*Joe 13
我不同意Jeff Moser的回答.
标准的.NET授权内容都可以使用Thread.CurrentPrincipal.例如:
PrincipalPermissionAttribute
PrincipalPermission.Demand
Run Code Online (Sandbox Code Playgroud)
此外,如果您配置.NET RoleProvider,它将设置Thread.CurrentPrincipal
为相同的主体HttpContext.User
.
因此,这是执行此操作的标准方法,我会在您的自定义身份验证代码中执行相同的操作(甚至更好 - 将其实现为自定义RoleProvider).
对于异步I/O,此博客文章指出,Thread.CurrentPrincipal
文化设置会自动传递给新线程.
Thread.CurrentPrincipal
如果您的库使用委托人进行授权,则使用可以说更安全,因为不受信任的代码可以作为参数传递主体,而CAS可能会阻止它进行设置Thread.CurrentPrincipal
.
归档时间: |
|
查看次数: |
6432 次 |
最近记录: |