MVC2 :: Как * ИСПОЛЬЗОВАТЬ * Пользовательский класс IIdentity? - PullRequest
3 голосов
/ 21 января 2011

Я пытаюсь сохранить целую загрузку информации о пользователе из веб-службы.Поскольку это информация о текущем аутентифицированном пользователе, я подумал, что имеет смысл хранить эту информацию в пользовательской реализации 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 Ответ

1 голос
/ 21 января 2011

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

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

Пример:

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].

...