在我的项目 (c#) 中,我们有一个 HttpModule,它创建了一个自定义 Principal,我们将其附加到 CurrentPrincipal。
这适用于我们所有的 MVC3 应用程序和我们的经典 ASP.Net 应用程序。
我们有一个 AuthorizeAttribute 覆盖我们用来保护我们的控制器方法 - 看起来很标准。
问题是在自定义 authorizeAttribute 中,用户 (httpContext.User) 是 RolePrincipal 而不是自定义主体。
为了排除故障,我在 global.asax 中放置了一些处理程序来捕获 beginrequest() 和 endrequest()。好吧,在 BeginRequest 中,我的 User 就是我们所期望的 - 自定义主体。在 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);
}