userNameまたはuserIdをパラメーターとして渡さずに、安全なApiControllerアクション内で現在のユーザーを取得するにはどうすればよいですか?
安全な行動の範囲内であるため、これは利用可能であると想定しています。安全なアクションとは、ユーザーが既に認証されており、リクエストにベアラートークンがあることを意味します。WebApiがユーザーを承認したとすると、アクションパラメーターとして渡さなくても、userIdにアクセスする組み込みの方法が存在する可能性があります。
userNameまたはuserIdをパラメーターとして渡さずに、安全なApiControllerアクション内で現在のユーザーを取得するにはどうすればよいですか?
安全な行動の範囲内であるため、これは利用可能であると想定しています。安全なアクションとは、ユーザーが既に認証されており、リクエストにベアラートークンがあることを意味します。WebApiがユーザーを承認したとすると、アクションパラメーターとして渡さなくても、userIdにアクセスする組み込みの方法が存在する可能性があります。
回答:
WebApi 2では、ApiControllerのRequestContext.Principal
メソッド内から使用できます
using Microsoft.AspNet.Identity;
のUser
プロパティを使用してプリンシパルにアクセスすることもできますApiController
。
したがって、次の2つのステートメントは基本的に同じです。
string id;
id = User.Identity.GetUserId();
id = RequestContext.Principal.Identity.GetUserId();
ヒントは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とセルフホストモードで互換性があるはずです
上記の提案のどれも私にとってはうまくいきませんでした。次はやった!
HttpContext.Current.Request.LogonUserIdentity.Name
多種多様なシナリオがあると思いますが、これは私にとってはうまくいきました。私のシナリオには、どちらもIISで実行されているAngularJSフロントエンドとWeb API 2バックエンドアプリケーションが含まれていました。Windows認証でのみ実行するように両方のアプリケーションを設定する必要がありました。
ユーザー情報を渡す必要はありません。ブラウザーとIISはログオンしているユーザーの資格情報を交換し、Web APIはユーザーの資格情報にオンデマンドでアクセスできます(IISからだと思います)。
.Net CoreではUser.Identity.Name
、ユーザーのNameクレームを取得するために使用します。
User.Identity.Name
名前クレームの値を取得します。Active Directory固有ではありません。
Asp.Identity UseManagerを使用している場合、それは自動的に
RequestContext.Principal.Identity.GetUserId()
基づくIdentityUserあなたは、作成に使用IdentityDbContextを。
カスタムユーザーテーブルとowinトークンベアラー認証を実装している場合は、私の回答をご確認ください。
Web API呼び出し中にユーザーコンテキストを取得する方法
まだお役に立てば幸いです。:)
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);
以下も参照してください。