MVC允许匿名,登录时仍然获得当前用户

时间:2012-09-07 14:52:08

标签: asp.net-mvc authentication subdomain asp.net-mvc-routing

我的MVC 4.0 / Razor网站存在问题。

这是我最近继承的(尚未推出)公共网站。 所有页面的90%应该可供所有人使用,其余页面适用于超级用户并需要身份验证。

这是通过面向公众的页面上的AllowAnonymous属性来处理的,就像这样实现;

public class RequireAuthenticationAttribute : AuthorizeAttribute
{
    public override void OnAuthorization(AuthorizationContext filterContext)
    {
        var skipAuthorization = filterContext.ActionDescriptor.IsDefined(typeof(AllowAnonymousAttribute), true) ||
                                filterContext.ActionDescriptor.ControllerDescriptor.IsDefined(
                                    typeof(AllowAnonymousAttribute), true);
        if (!skipAuthorization)
            base.OnAuthorization(filterContext);

    }
}

现在,问题在于我想对面向公众的网站进行一些自定义(为了争论,让我们假设“当前登录:XYZ” - 某处的标签)。我尝试过的是使用User.Identity,但在所有包含AllowAnonymous,User.Identity.Name ==“”的页面上,即使超级用户登录了。(如果他将网址更改为网页使用身份验证,他再次登录,并且User.Identity.Name是正确的。)

有没有办法同时使用“允许匿名”并跟踪谁登录?

1 个答案:

答案 0 :(得分:0)

我想我已经解决了这个问题。

问题是我们的自定义子域路由。我必须覆盖“域”设置,因此它指向.example.com而不是example.com的Cookie(主要是aspxauth)。

这需要一段时间才能实现的原因是许多其他定制部件,可能会干扰应用程序,尤其是:

  • 自定义成员资格提供程序
  • 自定义AllowAnonymous属性(即使现在有标准属性)
  • 事实上,我认为这是正常行为,实际上并非如此。

要点: 如果实施子域路由规则并且需要在子域之后进行身份验证,则必须更改cookie的基本域。