IIdentity を HttpContext.Current.User.Identity からカスタム IPrincipal にバインドしようとしていますが、収集できることから、ユーザーが認証される前に IIdentity は null です。
サンプルコード:
public interface ICustomPrincipal
{
int UserID { get; set; }
}
public class CustomPrincipal : ICustomPrincipal
{
private readonly IIdentity _identity;
private readonly IUserRepository _userRepository;
public CustomPrincipal(IIdentity identity, IUserRepository repository)
{
_identity = identity;
_repository = repository;
}
}
その後
protected void Application_AcquireRequestState(object sender, EventArgs e)
{
if (Request.IsAuthenticated && !Request.Url.AbsoluteUri.Contains(".axd"))
{
HttpContext.Current.User as CustomPrincipal;
}
}
IUserRepository を問題なくバインドできますが、IIdentity を適切にバインドする方法がわかりません。
Application_Start の CreateKernel() で HttpContext.Current.User.Identity をバインドしようとしましたが、問題は、IIdentity が null であることです。
また、GlobalFilters と Ninject.BindFilter メソッドを使用して CustomPrincipal を設定しようとしましたが、問題は IIdentity が null であることに戻ります。
IUserRepository にはコンストラクター インジェクションも含まれるため、CustomPrincipal のコンストラクターを呼び出したくありません。
正しくバインドしていないのか、実装方法が正しくないのかわかりません。アイデアや提案をいただければ幸いです。
最終的に達成しようとしているのは、 ICustomPrincipal を DB レベルに渡して、トランザクションの UserID を記録することです。
ありがとう