我知道之前已经回答了这个问题,但即使遵循了我能找到的所有解决方案,我仍然无法让我的角色在我的系统中工作。
我有一个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);
}
答案 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)
{
...
}