2016-07-10 9 views
2

私はaspnetコア1アプリケーションを作成しています。 ベアラトークン認証を使用するコントローラ内に正しいIDを持つUserプロパティがあります。しかし、私は静的なClaimPrincipal.Currentを使用する前と同じように、アイデンティティを取得する方法を見つけることができないようです。 ClaimPrincipalオブジェクトを通過させずにBLレイヤー内でこのデータを取得する現在のベストプラクティスは何ですか?aspnetコア1アプリケーションのロジックレイヤでClaimsPrincipalを取得する

services.AddTransient<ClaimsPrincipal>( s => s.GetService<IHttpContextAccessor>().HttpContext.User);

これはそれを注入するような奇妙な感じ、しかし、それは:また、私はそのように必要なところ、ClaimsPrincipalを注入するネイティブDIコンテナを使用することが可能であることがわかってきました。この問題を調査

答えて

3

CallContextに保存するよりも優れています。

0

私たちはあなたの問題を知っていますが、私たちはいくつかの経験がありました。私は、このソリューションを使用してユーザーデータを他の層に送信するために、メインレイヤー(Web APIなど)の一部です。認証はこのレイヤーなので、ビジネスロジックやその他のレイヤーにユーザー情報を入力する場合は、メソッドオーバーロードなどでユーザーデータを渡す必要があります。あなたがそれを変更し、この層のあなたの問題を解決するためのパターンを与えるための解決策です。あなたはあなたの問題を解決するために属性を使用し、Web API層のあなたのアクションにこの属性を入れ、ユーザーからデータを得ることができます。

拡張クラス(だけでいくつかのアクションで使用するためにあなたがそれを使用する必要はありません、あなたは他の方法で使用することができている)、ここだ...

public static class Extension 
{ 
    public static string GetUserName(this IPrincipal user) 
    { 
     var identity = (ClaimsIdentity)user.Identity; 
     IEnumerable<Claim> claims = identity.Claims; 
     return claims.FirstOrDefault(s => s.Type == "preferred_username")?.Value; 
    } 

} 

とどのようにあなたがコントローラでそれを呼び出すことができます( APIコントローラなど)。

[HttpGet] 
    public async Task<UserDto> FillLocalStorage() 
    { 
     return await personBussiness.GetPersonByUserName(User.GetUserName()); 
    } 

最後に、上記の例は単なる解決策であると言いたいと思います。

関連する問題