在我的项目(c#)中,我们有一个HttpModule,它创建了一个我们附加到CurrentPrincipal的自定义Principal。
这适用于我们所有的MVC3应用程序和我们的经典ASP.Net应用程序。
我们使用AuthorizeAttribute覆盖来保护我们的Controller方法 - 看起来非常标准。
问题是在自定义authorizeAttribute中,用户(httpContext.User)是RolePrincipal而不是自定义主体。
要进行故障排除,我在global.asax中放了一些处理程序来捕获beginrequest()和endrequest()。好吧,在BeginRequest中,我的用户就是我们所期望的 - 自定义主体。在EndRequest中,用户再次成为RolePrincipal。 HttpModule的web.config声明很好 - 我可以通过HttpModule的代码。
有谁知道发生了什么事?我们有一个自定义的HttpModule,但是我不能修改这个项目的代码(它在任何地方都可以使用,而且工作正常)。
这是我的第一个MVC4项目 - 我想知道MVC4是否做了不同的事情。
以下代码。有没有我遗漏的信息?
编辑:添加了授权地址代码。
Code
(In HttpModule)
private void BeginRequest(object Sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
var Id = new TASBIdentity();
context.User = new TASBPrincipal(Id);
Thread.CurrentPrincipal = context.User;
(etc...)
(In global.asax)
void Application_BeginRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
var user = context.User; // user is correct type
}
void Application_EndRequest(object sender, EventArgs e)
{
HttpContext context = HttpContext.Current;
var user = context.User; // user is default type (not correct)
}
(In the authorizeattribute)
public class SecuredByFunctionAttribute : AuthorizeAttribute
{
private readonly string _functionKey;
public SecuredByFunctionAttribute(string functionKey)
{
_functionKey = functionKey;
}
protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
return httpContext.User.IsInRole(_functionKey);
}