0

在我的项目 (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);
    }
4

0 回答 0