userIDをパラメーターとして渡さずに、ApiControllerアクション内で現在のユーザーを取得します。


97

userNameまたはuserIdをパラメーターとして渡さずに、安全なApiControllerアクション内で現在のユーザーを取得するにはどうすればよいですか?

安全な行動の範囲内であるため、これは利用可能であると想定しています。安全なアクションとは、ユーザーが既に認証されており、リクエストにベアラートークンがあることを意味します。WebApiがユーザーを承認したとすると、アクションパラメーターとして渡さなくても、userIdにアクセスする組み込みの方法が存在する可能性があります。


この回答を参照してください:stackoverflow.com/a/26453782/3290276クレームを追加してトリックを実行しました
Gabriela Macias '21

回答:


148

WebApi 2では、ApiControllerのRequestContext.Principalメソッド内から使用できます


1
その性質はないようです。うーん。古いバージョンのWebApiを使用している可能性があります。
Shaun Luttin、2014

2
@ShaunLuttinわかりました。WebAPI 1を使用している場合は、ApiControllerにPrinicpalプロパティがあると思います。これは、Request.Propertiesコレクションへのアクセスに関する優れたラッパーにすぎません。主要なオブジェクトはその辞書に格納されます。
Darrel Miller、

6
忘れないでくださいusing Microsoft.AspNet.Identity;
オーバーロード2016年

1
@DarrelMillerは、(コントローラー内ではなく)コードの他の部分から同じ(リクエストコンテキストなど)を取得する方法があります。
Ajay Aradhya 2018

2
@AjayAradhya渡した場合のみ。Webフレームワークに関するこれまでの取り組みでは、静的プロパティを使用してリクエストコンテキストにアクセスすると、あらゆる種類のアーキテクチャ上の問題が発生することが示されています。最初は便利ですが、長期的にはとても痛いです。
Darrel Miller、

35

Userプロパティを使用してプリンシパルにアクセスすることもできますApiController

したがって、次の2つのステートメントは基本的に同じです。

string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();

15
ここで書いたものを使用しようとしていますが、GetUserId()関数は常にnullを返します。ユーザーが認証され、ベアラートークンを渡しています。ApiControllerには[Authorize]ヘッダーがあります
Joshua Ohana

GetUserId()関数は、ユーザーがNameIdentifierクレームを持っている場合にのみIDを返します。これを解決する方法の例については、こちらのOswaldoの回答を参照してください:stackoverflow.com/questions/19505526
jramm

14

ヒントはWebapi2自動生成アカウントコントローラーにあります

ゲッターを次のように定義してこのプロパティを設定します

public string UserIdentity
        {
            get
            {
                var user = UserManager.FindByName(User.Identity.Name);
                return user;//user.Email
            }
        }

そして、UserManagerを取得するために-WebApi2で-Romansとして実行(AccountControllerとして読み取り)します。

public ApplicationUserManager UserManager
        {
            get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
        }

これはIISとセルフホストモードで互換性があるはずです


7

上記の提案のどれも私にとってはうまくいきませんでした。次はやった!

HttpContext.Current.Request.LogonUserIdentity.Name

多種多様なシナリオがあると思いますが、これは私にとってはうまくいきました。私のシナリオには、どちらもIISで実行されているAngularJSフロントエンドとWeb API 2バックエンドアプリケーションが含まれていました。Windows認証でのみ実行するように両方のアプリケーションを設定する必要がありました。

ユーザー情報を渡す必要はありません。ブラウザーとIISはログオンしているユーザーの資格情報を交換し、Web APIはユーザーの資格情報にオンデマンドでアクセスできます(IISからだと思います)。


6

Karan Bhandariの答えは良いですが、プロジェクトに追加されたAccountControllerはおそらくMvc.Controllerです。彼の回答をApiControllerで使用するために変更HttpContext.Current.GetOwinContext()Request.GetOwinContext()、次の2つのusingステートメントを追加したことを確認します。

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;


3

Asp.Identity UseManagerを使用している場合、それは自動的に

RequestContext.Principal.Identity.GetUserId()

基づくIdentityUserあなたは、作成に使用IdentityDbContextを

カスタムユーザーテーブルとowinトークンベアラー認証を実装している場合は、私の回答をご確認ください。

Web API呼び出し中にユーザーコンテキストを取得する方法

まだお役に立てば幸いです。:)


1
string userName;
string userId;
if (HttpContext.Current != null && HttpContext.Current.User != null 
        && HttpContext.Current.User.Identity.Name != null)
{
    userName = HttpContext.Current.User.Identity.Name;
    userId = HttpContext.Current.User.Identity.GetUserId();
}

または、Darrel Millerのコメントに基づいて、おそらくこれを使用して、最初にHttpContextを取得します。

// get httpContext
object httpContext;
actionContext.Request.Properties.TryGetValue("MS_HttpContext", out httpContext);    

以下も参照してください。

Web APIアクション内からHTTPContextにアクセスする方法


5
ホスティングオプションが制限され、コードのテストが困難になるため、HttpContextは使用しないでください。
Darrel Miller、

セルフホストの場合、またはOwinHttpListenerがホストされている場合、HttpContextオブジェクトはディクショナリに含まれません
Darrel Miller 14
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.