Роли аутентификации Asp.Net MVC без провайдеров - PullRequest
1 голос
/ 29 ноября 2011

Я знаю, что здесь уже был дан ответ, однако даже после того, как я выполнил все найденные решения, я не могу заставить свои роли работать в моей системе.

У меня есть приложение 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);
}

1 Ответ

2 голосов
/ 29 ноября 2011

В соответствии с основным предложением я реализовал роли в 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)
{
    ...
}
...