3

Я пытаюсь сохранить весь грузовик информации о пользователе из веб-службы. Поскольку это информация о пользователе, прошедшем проверку подлинности, я подумал, что имеет смысл хранить эту информацию в пользовательской реализации IIdentity.MVC2 :: Как использовать * USE * пользовательский класс IIdentity?

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

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

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

Я пытаюсь обернуть мозг вокруг потока программ безопасности с помощью IIdentity, IPrincipal и авторизации роли в приложении 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 объекта пользователя который доступен в каждом контроллере?

В обычном варианте применения фильтра [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].

+0

Я заметил, что для _provider не существует экземпляра - почему? –

+0

@ScottSEA, эта переменная '_provider' может быть любой, которая позволяет вам получать аутентифицированную информацию пользователя. –

+0

Так было бы безопасно создать его здесь в этом методе? ... и по какой-то причине я получаю сообщение об ошибке «Нет подходящего метода для переопределения» для AuthorizeCore (HttpContextBase httpContext) –

Смежные вопросы