1

私はヘッダー内のトークンを検証し、ユーザープリンシパルを設定するカスタム認証属性を持っています。私は、コントローラ enter image description here.NET Web API 2 UserPrincipal.IsAuthenticated依存インジェクション(Unity)を使用すると常にfalseです。

内のアイデンティティを確認するが、私は私のサービスクラスにIPrincipalを注入するとき、それはもう動作しない場合

//when token is validated 
var userIdentityBase = new UserIdentityBase(token); <-- Inherited GenericIdentity 
IPrincipal principal = new GenericPrincipal(userIdentityBase, null); 

actionContext.Request.GetRequestContext().Principal = principal; 
HttpContext.Current.User = principal; 
Thread.CurrentPrincipal = principal; 

これが正常に動作します。 IsAuthenticatedはfalseです。

Unityセットアップコード:

container.RegisterType<IPrincipal>(new InjectionFactory(u => HttpContext.Current.User)); 

注射した場合、それは動作しません(両方のスクリーンショットは、同じ要求をwithing取られ): enter image description here

任意の提案ですか?

+0

依存関係リゾルバは、アプリケーション開始の依存関係を解決しています。その時点で現在のユーザーはいません –

+0

@MarcusHしたがって、実行時にユーザープリンシパルを挿入する方法はありませんか? – Robert

+0

私はそこにいるとは思わないが、私はそれをサポートする事実がない。私はパラメータとしてユーザーを渡すか、または静的変数を現在のユーザーに設定することによって、この問題を解決しました。 –

答えて

0

私は、実行時にユーザーIDを抽出する独自のインターフェイスと実装を作成することでこれを解決しました。私の場合のために作品の魅力のよう

インタフェース

public interface IIdentityProvider 
{ 
    IPrincipal GetPrincipal(); 
} 

実装:

public class IdentityProvider : IIdentityProvider 
{ 
    public IPrincipal GetPrincipal() 
    { 
     return HttpContext.Current.User; 
    } 
} 

団結登録:

container.RegisterType<IIdentityProvider, IdentityProvider>(); 

と使用方法:

IIdentityProvider _identityProvider; 
public BookingRecordService(IIdentityProvider identityProvider) 
{ 
    _identityProvider = identityProvider; 

    var isAuth = _identityProvider.GetPrincipal().Identity.IsAuthenticated; 
} 
関連する問題