Я использовал IoC, чтобы абстрагироваться с некоторым успехом. Сначала я определил класс для представления текущего пользователя, вошедшего в систему:
public class CurrentUser
{
public CurrentUser(IIdentity identity)
{
IsAuthenticated = identity.IsAuthenticated;
DisplayName = identity.Name;
var formsIdentity = identity as FormsIdentity;
if (formsIdentity != null)
{
UserID = int.Parse(formsIdentity.Ticket.UserData);
}
}
public string DisplayName { get; private set; }
public bool IsAuthenticated { get; private set; }
public int UserID { get; private set; }
}
Требуется IIdentity
в конструкторе, чтобы установить его значения. Для модульных тестов вы можете добавить другой конструктор, чтобы обойти зависимость IIdentity
.
А затем я использую Ninject (выберите ваш любимый контейнер IoC, не имеет значения) и создал привязку для IIdentity
как таковую:
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
Затем внутри моего контроллера я объявляю зависимость в конструкторе:
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
Контейнер IoC видит, что HomeController
принимает объект CurrentUser
, а конструктор CurrentUser
принимает IIdentity
. Это разрешит зависимости автоматически, и вуаля! Ваш контроллер может знать, кто в данный момент вошел в систему. Похоже, с FormsAuthentication у меня все работает очень хорошо. Возможно, вы сможете адаптировать этот пример для аутентификации Windows.