私はこれがなぜ機能しないのかを理解しようとして1時間探していました。
WebAPIを使用したASP.Net MVC 5アプリケーションがあります。 Request.GetOwinContext()。Authenticationを取得しようとしていますが、GetOwinContextを含める方法が見つからないようです。ここに私のコードがあります:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using TaskPro.Models;
namespace TaskPro.Controllers.api
{
public class AccountController : ApiController
{
[HttpPost]
[AllowAnonymous]
public ReturnStatus Login(LoginViewModel model)
{
if (ModelState.IsValid)
{
var ctx = Request.GetOwinContext(); // <-- Can't find this
return ReturnStatus.ReturnStatusSuccess();
}
return base.ReturnStatusErrorsFromModelState(ModelState);
}
}
}
私が読んだものから、それはSystem.Net.Httpの一部であるはずですが、私はそれを含めました、そして、それはまだ解決していません。 Ctrl-Spaceでもインテリセンスオプションは提供されません。
ここで何が欠けていますか?
GetOwinContext
拡張メソッドはSystem.Web.Http.Owin
dllにあり、これはnugetパッケージとしてダウンロードする必要があります(nugetパッケージ名はMicrosoft.AspNet.WebApi.Owin)
Install-Package Microsoft.AspNet.WebApi.Owin
ここでmsdnを参照してください: http://msdn.Microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v = vs.118).aspx
Nugetパッケージはこちら: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin
ただし、このメソッドはSystem.Net.Http
名前空間の一部であるため、using
定義は問題ありません。
編集
さて、混乱を解消するには:ApiController(つまりMyController : ApiController
)を使用している場合は、Microsoft.AspNet.WebApi.Owin
パッケージが必要です。
通常のMvcコントローラー(つまり、MyController : Controller
)を使用している場合は、Microsoft.Owin.Host.SystemWeb
パッケージが必要です。
MVC 5では、Apiと通常のMVCのパイプラインは非常に異なっていましたが、多くの場合同じ命名規則があります。したがって、一方の拡張メソッドはもう一方には適用されません。多くのアクションフィルターなどで同じです。
これらのどれも私にとってはうまくいきませんでした。 NugetパッケージをIdentityで作成されたパッケージと比較する必要がありましたが、このNugetパッケージが見つからないため、追加すると問題が修正されました
Microsoft.Owin.Host.SystemWeb
どうやら、ASP.NETリクエストパイプラインを使用してIISでOWINを実行するために必要なようです(それなしでねじ込まれていることを読んでください!)
WEB APIでは、次を使用して参照を取得できます。
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
identity 2.0で動作します
これを行うには、NuGetパッケージMicrosoft.Owin.Host.SystemWeb
を追加する必要がある場合があります。
HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
私の場合、追加する必要があります
using Microsoft.AspNet.Identity.Owin;
次の行でGetOwinContextを解決してからGetUserManagerを解決します。
Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
この問題があり、問題を解決するためにnugetから追加のパッケージをダウンロードします(パッケージマネージャーコンソールで次のコマンドを実行します) Install-Package Microsoft.Owin.Host.SystemWeb
これは簡単な答えを見つけるのに永遠にかかりました:しかし、私がしたことは、スタートアップでインスタンス化されたIOwinContextの単一インスタンスのGet拡張を使用することでした。そのため、次のようになりました。
private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();
public ApplicationUserManager UserManager
{
get
{
return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
}
private set
{
_userManager = value;
}
}
パッケージが欠落していました:Microsoft.AspNet.WebApi.Owin for ApiControllers。お役に立てれば!
GetOwinContext()
拡張メソッドは、GUIスレッド以外のスレッドでは見つかりません。
したがって、await
ed関数内からこの関数を呼び出さないように注意してください。
これと同じ問題があり、プライベートメソッドを使用して解決しました:private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }
これは私のために泳ぎました。
ASP.NETのデフォルトプロジェクトを確認した後、アプリケーションのスタートアップにこれを含める必要があることを発見しました。
// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in
// with a third party login provider
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);`
(この回答は、質問で使用されるタグに対応するASP.NET Web API用です。問い合わせがASP.NETに関する場合は、 この質問 を参照してください。 MVC。)
この質問は、ASP.NET Web APIサービスが hosted になる方法を指定していません。 この投稿 のダイアログは(強調鉱山)を示します:
kichallaは2014年10月24日午前1時35分に書いた
セルフホスティングではない場合は、IISでMicrosoft.AspNet.WebApi.Owinパッケージを使用しないでください...このパッケージは使用することになっていますセルフホスティング.
受け入れられた答え でMicrosoft.AspNet.WebApi.Owin
パッケージの使用を推奨します。この回答では、IISでASP.NET Web APIサービスをホストしている場合に何が機能したかを報告しています。
まず、次のNuGetパッケージをインストールします。
Microsoft.Owin.Host.SystemWeb
ASP.NET要求パイプラインを使用して、OWINベースのアプリケーションをIISで実行できるようにするOWINサーバー。
(私が書いているとき、このNuGetパッケージの最新の利用可能なバージョンは3.1.0であることに注意してください。また、それが重要な範囲で、私はVisual Studio 2013 Update 5を使用)
このNuGetパッケージをインストールした後、次のことができます。
using Microsoft.Owin;
using System.Web;
IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();
さて、これらの声明がどのように解決されるかについていくつかの光を当てるVisual Studioで、いずれかのステートメントでGetOwinContext
を右クリックし、[ピーク定義]を選択すると、Visual Studioは次を表示します。
// Assembly Microsoft.Owin.Host.SystemWeb.dll, v3.1.0.0
using Microsoft.Owin;
using System;
using System.Runtime.CompilerServices;
namespace System.Web
{
public static class HttpContextExtensions
{
public static IOwinContext GetOwinContext(this HttpContext context);
public static IOwinContext GetOwinContext(this HttpRequest request);
}
}
ご覧のとおり、System.Web
名前空間内には、twoGetOwinContext
拡張メソッドがあります。
HttpContext
クラスの1つ、およびHttpRequest
クラスのもう1つ。繰り返しになりますが、IISでWeb APIサービスをホストしている人たちにとって、2017年後半にGetOwinContext
の定義がどこで見つかるかについてのあいまいさが解消されることを期待しています。
パッケージMicrosoft.AspNet.Identity.Owin
を追加する必要がありました