web-dev-qa-db-ja.com

System.Web for OwinでHttpContextを使用する代わり

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プロジェクトで動作するソリューションを求めていますが、それは私には無効です。

23
Xavier Egea

この記事 は私に解決策を与えます:

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への参照はもう必要ありません。

9
Xavier Egea

OwinRequestScopeContext を使用できます。まさにあなたが探しているものをやっています。

9
nsgocev

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もこの方法で利用できます。

3
Morio