ASP.NET認証は、OWINベースのホストで使用できるOWINミドルウェアに基づいています。 ASP.NET IDはSystem.Webに依存しません。
AuthorizeAttributeフィルターを使用して、現在のユーザーを取得し、後でアクションコントローラーによって取得されるプロパティを追加する必要があります。
問題は、System.Webに属するHttpContextを使用する必要があることです。 OwinのHttpContextの代替はありますか?
public class WebApiAuthorizeAttribute : AuthorizeAttribute
{
public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken)
{
base.OnAuthorization(actionContext);
Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());
ApplicationUserManager manager = new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext())) { PasswordHasher = new CustomPasswordHasher() };
ApplicationUser user = await manager.FindByIdAsync(userId);
actionContext.Request.Properties.Add("userId", user.LegacyUserId);
}
}
注: この質問 が見つかりましたが、重複しているようですが、NancyFxプロジェクトで動作するソリューションを求めていますが、それは私には無効です。
この記事 は私に解決策を与えます:
Web API 2は、プリンシパルプロパティを含む新しいRequestContextクラスを導入しました。これは、発信者の身元を探すのに適切な場所です。これは、Thread.CurrentPrincipalまたはHttpContext.Userの以前のメカニズムを置き換えます。これは、Web APIで呼び出し元を認証するコードを書いている場合に割り当てるものでもあります。
したがって、行を変更するだけです:
Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId());
沿って
Guid userId = new Guid(actionContext.RequestContext.Principal.Identity.GetUserId());
現在、System.Webへの参照はもう必要ありません。
OwinRequestScopeContext を使用できます。まさにあなたが探しているものをやっています。
this を読んだ後。 AuthorizeAttributeを拡張することは、まだ道であるように思えます。ただし、HttpContextはIISベースであるため、今後は使用しないでください。
HttpActionContextが渡されます。その後、使用できます
_actionContext.Request.GetRequestContext().Principal.Identity
_
または
_actionContext.RequestContext.Principal.Identity
_
OR
actionContext.Request.GetOwinContext().Request.User.Identity
でIDを取得します。 3つすべてが同じIDオブジェクトを取得します。
はい、OwinContextもこの方法で利用できます。