没有提供商的Asp.Net MVC身份验证角色

时间:2011-11-28 21:37:47

标签: asp.net asp.net-mvc forms-authentication

我知道之前已经回答了这个问题,但即使遵循了我能找到的所有解决方案,我仍然无法让我的角色在我的系统中工作。

我有一个Asp.Net MVC应用程序,基于表单的身份验证。它使用OpenAuth / OpenID进行身份验证,使用应用程序角色的数据库查找表,而不是使用本地数据库。

根据主要建议,我在Global.asax中实施了角色,如:

protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
    //Fires upon attempting to authenticate the use
    if (HttpContext.Current.User != null &&
        HttpContext.Current.User.Identity.IsAuthenticated &&
        HttpContext.Current.User.Identity.GetType() == typeof (FormsIdentity))
        Thread.CurrentPrincipal = HttpContext.Current.User = OpenAuthPrincipal.Get(HttpContext.Current.User.Identity.Name);
}

这里OpenAuthPrincipal.Get是一个非常简单的静态方法,它包含带有角色的openauth id:

public static IPrincipal Get(string userId)
{
    var db = new WebData();
    var user = db.Users.Find(userId);

    return new GenericPrincipal(new Identity(user), user.Roles.Split('|'));
}

然而,当我达到如下功能时:

[Authorize(Roles = "Admin")]
public ActionResult Edit(int id)
{
        ...
}

失败了。如果我删除了角色限制,并在调试器中检查User.IsInRole("Admin"),我会得到false。但是,如果我在Global.asax中进行检查,则会收到true

我知道User.Identity.Name正确无误。并且IIdentity根本没有修改。但是只有角色丢失了。

这个问题可能是什么原因?

更新

下面推荐的解决方案没有直接起作用,但是这一改变为我解决了这个问题:

protected override bool AuthorizeCore(System.Web.HttpContextBase httpContext)
{
    httpContext.User = OpenAuthPrincipal.Get(httpContext.User.Identity.Name);

    return base.AuthorizeCore(httpContext);
}

1 个答案:

答案 0 :(得分:2)

  

根据主要建议,我在Global.asax中实现了角色,如:

不知道从哪里获得这个主要建议,但在ASP.NET MVC中,您通常使用授权操作过滤器。由于默认的授权过滤器不能满足您的需求,您可以自己编写:

public class OpenIdAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var authorized = base.AuthorizeCore(httpContext);
        if (authorized)
        {
            httpContext.User = OpenAuthPrincipal.Get(httpContext.User.Identity.Name);
        }
        return authorized;
    }
}

然后:

[OpenIdAuthorize(Roles = "Admin")]
public ActionResult Edit(int id)
{
    ...
}