Я быстро что-то взбил. Один из возможных способов простого введения пользовательского IPrincipal в ASP.NET MVC заключается в следующем:
1) Создайте собственного потомка интерфейса IPrincipal.
public interface IMyPrincipal : IPrincipal
{
Guid UserId { get; }
string EmailAddress { get; }
}
2) Предположим, что вы используете провайдера ASP.NET для проверки подлинности ваших пользователей. Давайте быстро создадим реализацию IMyPrincipal, которая использует API членства.
public class MyPrincipal : IMyPrincipal
{
private MembershipUser _user;
public MyPrincipal()
{
this._user = Membership.GetUser();
var userName = this._user != null ? this._user.UserName : String.Empty;
this.Identity = new GenericIdentity(userName);
}
public Guid UserId
{
get
{
return this._user != null ? (Guid) this._user.ProviderUserKey :
default(Guid);
}
}
public string EmailAddress
{
get
{
return this._user != null ? this._user.Email : null;
}
}
public IIdentity Identity { get; private set; }
public bool IsInRole(string role) { return false; }
}
3) Создайте свой собственный тип базового класса для ваших контроллеров. Скройте унаследованный член User и представьте своего собственного IPrincipal потомка.
public class BaseController : Controller
{
protected virtual new MyPrincipal User
{
get { return HttpContext.User as MyPrincipal; }
}
}
4) Все ваши контроллеры наследуются от этого нового типа BaseController.
public class HomeController : BaseController
{
//...
}
5) Создайте свою собственную фабрику контроллеров, чтобы убедиться, что ваш принципал введен в HttpContext / Thread.
public class MyControllerFactory : DefaultControllerFactory
{
protected override IController GetControllerInstance
(RequestContext requestContext, Type controllerType)
{
try
{
var controller = base.GetControllerInstance(requestContext, controllerType);
requestContext.HttpContext.User = Thread.CurrentPrincipal = new
MyPrincipal();
return controller;
}
catch (Exception)
{
return base.GetControllerInstance(requestContext, controllerType);
}
}
}
6) Зарегистрируйте фабрику контроллера в обработчике событий Application_Start () Global.asax.
var controllerFactory = new MyControllerFactory();
ControllerBuilder.Current.SetControllerFactory(controllerFactory);
Вуаля, теперь вы можете использовать нового пользователя (IMyPrincipal) в любом месте ваших контроллеров.
Например:
public ActionResult Index()
{
ViewBag.Message = "Welcome to ASP.NET MVC!";
ViewBag.UserId = User.UserId;
ViewBag.UserName = User.EmailAddress;
return View();
}