Я знаю, что здесь уже был дан ответ, однако даже после того, как я выполнил все найденные решения, я не могу заставить свои роли работать в моей системе.
У меня есть приложение 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 с ролями:
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);
}