J'ai utilisé IoC pour faire abstraction de cela avec un certain succès. J'ai d'abord défini une classe pour représenter l'utilisateur actuellement connecté :
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; }
}
Il faut un IIdentity
dans le constructeur pour définir ses valeurs. Pour les tests unitaires, vous pouvez ajouter un autre constructeur pour vous permettre de contourner la méthode d'évaluation de l'utilisateur. IIdentity
dépendance.
Ensuite, j'utilise Ninject (choisissez votre conteneur IoC préféré, peu importe), et je crée une liaison pour IIdentity
comme tel :
Bind<IIdentity>().ToMethod(c => HttpContext.Current.User.Identity);
Ensuite, dans mon contrôleur, je déclare la dépendance dans le constructeur :
CurrentUser _currentUser;
public HomeController(CurrentUser currentUser)
{
_currentUser = currentUser;
}
Le conteneur IoC voit que HomeController
prend un CurrentUser
et l'objet CurrentUser
prend un IIdentity
. Il résoudra les dépendances automatiquement, et voilà ! Votre contrôleur peut savoir qui est l'utilisateur actuellement connecté. Cela semble fonctionner assez bien pour moi avec FormsAuthentication. Vous pouvez peut-être adapter cet exemple à l'authentification Windows.