MVC2:: Как я * USE * пользовательский класс 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;
  }

    }
+3
20 янв. '11 в 23:09
источник поделиться
1 ответ

Что и где лучше всего помещать информацию пользователя членства в объект пользователя 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].

+1
21 янв. '11 в 9:15
источник

Посмотрите другие вопросы по меткам или Задайте вопрос