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]
приписывать.