2011-11-28 122 views
1

我知道这已经在这里得到解答,但是即使在遵循我所能找到的所有解决方案之后,我仍然无法让我的角色在我的系统中工作。没有提供商的Asp.Net MVC身份验证角色

我有一个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); 
} 

回答

2

按照主的建议,我实现了在全球的角色.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) 
{ 
    ... 
} 
+0

好吧,我会考虑这一点。当我搜索这个问题时,我在StackOverflow中看到了这个解决方案,并且在网络中也有类似的代码。无论如何,显然它不工作。 – sukru

+0

谢谢,我得到了它的工作。但是,这似乎是基于方法的。是否可以覆盖整个网站? – sukru

+0

你也可以用你的属性装饰整个控制器。 –