MVC2:: Как * ИСПОЛЬЗОВАТЬ * Пользовательский класс IIdentity?

Я пытаюсь сохранить всю информацию о пользователе из веб-сервиса. Поскольку это информация о текущем аутентифицированном пользователе, я подумал, что имеет смысл сохранить эту информацию в пользовательской реализации IIdentity.

Обычай MagicMembershipProvider.GetUser(string id, bool userIsOnline) вызывает веб-сервис и возвращает MagicMembershipUser экземпляр со всеми заполненными полями (отдел, номер телефона, другая информация о сотруднике).

Пользовательский поставщик членства и пользовательский членский член работают нормально.

Что и где является лучшим способом поместить информацию о членстве в IPrincipal User объект, который доступен в каждом контроллере?

Я пытался обернуть свой мозг вокруг потока программной безопасности с помощью IIdentity, IPrincipal и Role-авторизации в приложении MVC2 - но я действительно изо всех сил здесь и мог бы использовать некоторое наставничество. Там в интернете тонна статей про запчасти, но не много обо всем.

редактировать

Мое лучшее предположение на данный момент - назначить HttpContext.Current.User в FormsAuthenticationService:

public void SignIn(string userName, bool createPersistentCookie)
{
  if (String.IsNullOrEmpty(userName)) 
    throw new ArgumentException("Value cannot be null or empty.", "userName");

  try
  {
    FormsAuthentication.SetAuthCookie(userName, createPersistentCookie);
    MagicMembershipUser magicUser = _provider.GetUser("", false) 
      as MagicMembershipUser;
    MagicIdentity identity = new MagicIdentity(userName, magicUser);
    GenericPrincipal principal = new GenericPrincipal(identity, null);

    HttpContext.Current.User = principal;
  }
  catch (Exception)
  {
    throw;
  }

    }

1 ответ

Решение

Как и где лучше всего поместить информацию о членстве в объекте IPrincipal User, который доступен на каждом контроллере?

В обычай [Authorize] реализация фильтра. Вы можете переопределить метод AuthorizeCore и вызвать базовый метод и, если он вернет true, запросить вашего провайдера членства и вставить пользовательскую магическую идентификацию в контекст.

Пример:

public class MagicAuthorizeAttribute : AuthorizeAttribute
{
    protected override bool AuthorizeCore(HttpContextBase httpContext)
    {
        var isAuthorized = base.AuthorizeCore(httpContext);
        if (isAuthorized)
        {
            var username = httpContext.User.Identity.Name;
            var magicUser = _provider.GetUser(username, false) as MagicMembershipUser;
            var identity = new MagicIdentity(username, magicUser);
            var principal = new GenericPrincipal(identity, null);
            httpContext.User = principal;
        }
        return isAuthorized;
    }
}

Теперь все, что осталось, это украсить ваш базовый контроллер [MagicAuthorize] приписывать.

Другие вопросы по тегам