UserNameまたはuserIdをパラメーターとして渡さずに、安全なApiControllerアクション内で現在のユーザーを取得するにはどうすればよいですか?
私たちは安全な行動の範囲内にあるので、これが利用可能であると仮定します。セキュリティで保護されたアクションであるということは、ユーザーが既に認証済みであり、要求にベアラートークンがあることを意味します。 WebApiがユーザーを承認している場合、アクションパラメーターとして渡すことなく、userIdにアクセスするための組み込みの方法があるかもしれません。
WebApi 2では、ApiControllerのメソッド内からRequestContext.Principal
を使用できます
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では-do Roman(AccountControllerとして読む)do
public ApplicationUserManager UserManager
{
get { return HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>(); }
}
これは、IISおよびセルフホストモードで互換性がある必要があります
上記の提案はどれもうまくいきませんでした。以下がやった!
HttpContext.Current.Request.LogonUserIdentity.Name
さまざまなシナリオがあると思いますが、これは私にとってはうまくいきました。私のシナリオでは、AngularJSフロントエンドとWeb API 2バックエンドアプリケーションを両方ともIISで実行しました。 Windows認証で両方実行するアプリケーション排他的を設定する必要がありました。
ユーザー情報を渡す必要はありません。ブラウザーとIISはログオンしたユーザー資格情報を交換し、Web APIは(IISから推測して)オンデマンドでユーザー資格情報にアクセスします。
Karan Bhandariの答えは良いですが、プロジェクトに追加されたAccountControllerはおそらくMvc.Controller
です。 ApiControllerで使用するために彼の回答を変換するには、HttpContext.Current.GetOwinContext()
をRequest.GetOwinContext()
に変更し、次の2つのusing
ステートメントを追加したことを確認します。
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
.Net Coreでは、User.Identity.Name
を使用して、ユーザーの名前クレームを取得します。
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);
こちらもご覧ください: