我知道这已经在这里得到解答,但是即使在遵循我所能找到的所有解决方案之后,我仍然无法让我的角色在我的系统中工作。没有提供商的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);
}
好吧,我会考虑这一点。当我搜索这个问题时,我在StackOverflow中看到了这个解决方案,并且在网络中也有类似的代码。无论如何,显然它不工作。 – sukru
谢谢,我得到了它的工作。但是,这似乎是基于方法的。是否可以覆盖整个网站? – sukru
你也可以用你的属性装饰整个控制器。 –