web-dev-qa-db-ja.com

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

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

私たちは安全な行動の範囲内にあるので、これが利用可能であると仮定します。セキュリティで保護されたアクションであるということは、ユーザーが既に認証済みであり、要求にベアラートークンがあることを意味します。 WebApiがユーザーを承認している場合、アクションパラメーターとして渡すことなく、userIdにアクセスするための組み込みの方法があるかもしれません。

84
Shaun Luttin

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

132
Darrel Miller

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

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

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

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

このプロパティにゲッターを次のように定義してください

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

そして、UserManagerを取得するために-WebApi2では-do Roman(AccountControllerとして読む)do

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

これは、IISおよびセルフホストモードで互換性がある必要があります

14
Karan Bhandari

上記の提案はどれもうまくいきませんでした。以下がやった!

HttpContext.Current.Request.LogonUserIdentity.Name

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

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

6
kannankeril

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

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
5
Jeff Leach

.Net Coreでは、User.Identity.Nameを使用して、ユーザーの名前クレームを取得します。

4

Asp.Identity UseManagerを使用している場合、次の値を自動的に設定します

RequestContext.Principal.Identity.GetUserId()

IdentityUserに基づいて、IdentityDbContextの作成に使用します。

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

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

それがまだ役立つことを願っています。 :)

3
pampi
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にアクセスする方法

1
Shaun Luttin