1

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 を記録することです。

ありがとう

4

1 に答える 1