ASP.NET Identity-HttpContextにはGetOwinContextの拡張メソッドがありません


384

ここからASP.NET Identityサンプルをダウンロードして正常に実行しました:https : //github.com/rustd/AspnetIdentitySample

私は自分のプロジェクトにASP.NET Identityフレームワークを実装している最中で、問題に遭遇しました。

GetOwinContext() 私の拡張メソッドとして存在しません HttpContext

アイデンティティフレームワークをクラスライブラリに実装しています。Identity Frameworkのすべての最新(プレリリースバージョン)をインストールしましたが、これ以外のすべてが正常に機能しています。

コントローラに同じコードを同じダイレクトとして実装してみましたが、同じ問題が見つかりました。

どこかで参照が欠けているのは明らかですが、何なのかわかりません。

私を殺しているコードブロックは:

private IAuthenticationManager AuthenticationManager
{
    get
    {
        return HttpContext.GetOwinContext().Authentication;
    }
}

私は以下への参照を追加しました-私のクラスライブラリとコントローラーの両方でこれらを試してみましたが、どれも私にとってはうまくいきません...

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;

...これが私を壁に駆り立てています...何かアイデアはありますか?

更新

サンプルでIdentity&OWINのバージョンを確認し、ソリューションに同じバージョンがあることを確認しました。

さらに、サンプルでオブジェクトブラウザーを検索するとGetOwinContext、メソッドを見つけることができますが、ソリューションで検索すると、どこにも見つかりません...いくつかのライブラリが古くなっている必要がありますが、見つけて!

回答:


713

ARGH!

私はそれを見つけました ...と呼ばれる追加のパッケージを持っていませんでしたMicrosoft.Owin.Host.SystemWeb

これを検索してインストールすると、うまくいきました。

今-私はすべてを逃しただけかどうかはわかりませんが、さまざまなチュートリアルを実行したときに、そのようなライブラリまたはパッケージへの参照は見つかりませんでした。このすべてのIdentityフレームワークをインストールしたときにもインストールされませんでした。

EDIT それは中ですがMicrosoft.Owin.Host.SystemWeb、それはで拡張メソッドであるアセンブリSystem.Webあなたは、元の参照を持っている、とする必要があるので、名前空間using後者。


6
それを理解してくれてありがとう:私はこのチュートリアルasp.net/identity/overview/getting-started/を使用しています...そしてそれは足りないステップです
フランスの

23
@tne-コメントありがとうございます...私はほとんど「目的もなく走り回っていた」わけではありませんでした-信頼できるリソースからのチュートリアルに従っていました。asp.netサイトからです。彼らはチュートリアルにそのステップがありませんでした(追加されたので)-また、人々がこの回答と元のQの両方を賛成しているという事実も、この問題の唯一の問題ではないことを示しています。
Darren Wainwright 14年

5
@ダーレン、十分に公正です。(私はそれを別の言い方で言ったかもしれないと思います。)
2015年


5
この参照の更新によるものかどうかはわかりませんが、割り当てを少し変更するvar authenticationManager = HttpContext.Current.GetOwinContext().Authentication;必要がありました(現在、質問にない場所が含まれています)。
Ortund

177

HttpContextコントローラの外にいる場合は、電流を参照する必要があると思います。MVCコントローラーには、現在のコンテキストへの基本参照があります。ただし、それ以外の場合は、現在のものを使用することを明示的に宣言する必要があります。HttpContext

return HttpContext.Current.GetOwinContext().Authentication;

表示されないことについてIAuthenticationManagerは、上記で示したコード()を使用する新しいMVC 5プロジェクトテンプレートには、アカウントコントローラーの上部に次のusingステートメントがあります。

using System.Threading.Tasks;
using System.Web;
using System.Web.Mvc;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using WebApplication2.Models;

それぞれをコメントアウトして表示されます GetOwinContext()実際にはSystem.Web.Mvcアセンブリの一部である。


これを試してみましたが、見つかりません。-GetOwinContext()という意味です。
ダレンウェインライト

2
@Darren-サンプルテンプレートを少し遊んだところ、アセンブリが不足している可能性があります。System.Web.Mvcクラスプロジェクトから参照する必要があるようです。コメントアウトすると、それがHttpContext.GetOwinContext()不明になりました(Microsoft.Owin.Securityアセンブリではありません)
Tommy

私もこれをコントローラで直接動作させるようにしてきました-そして再びそれを見つけることができません。
Darren Wainwright

19
これは私をつまずかせました。クラスHttpContextにはパブリックプロパティがあるControllerため、継承した場合、HttpContext.GetOwinContext()、期待どおり動作します。ApiControllerただし、継承した場合、そのようなプロパティはありません。したがって、HttpContextはクラスを参照します。これを使用Currentして、クラスのインスタンスにアクセスする必要があります。したがって、コントローラからApiControllerにコードをコピーして貼り付け、なぜそれが機能しないのか疑問に思うなら、これがあなたの答えです。
David Miani 2014年

「現在」が私にとっての落とし穴だった
Click Ok

24

私のコントローラーとAsp.Netテンプレートコントローラーの使用ステートメントを比較して試行錯誤した後

using System.Web;

私のために問題を解決しました。追加する必要があります:

using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;

GetUserManagerメソッドを使用します。

マイクロソフトは、右クリックでこれを自動的に解決し、他の不足しているusingステートメントのように解決する方法を見つけることができませんでしたか?


1
これも私にとってはうまくいきました。Identityライブラリは既に持っていましたが、System.Webが必要なようです。
SouthShoreAK 2015

1
これは明らかに、アセンブリと名前空間の両方で多くの動きを見せています。それが拡張メソッドであることでそれを本当に苦痛にします。すべてのライブラリを更新しましたが、この回答は現在の場所を反映しています。
シャノン2015年

ああ、あなたは新しい形のdllの地獄
JustJohn

1
はい、残念ながら、拡張メソッドは自動的に解決できません。
Ronen Festinger 2017年

22

私の場合、nugetを介してMicrosoft.AspNet.WebApi.Owin参照を追加するとうまくいきました。


はい、これは私のために現在の最新バージョンでそれをしました。拡張メソッドは、Assemby System.Web.Http.Owinであるこのパッケージ内にあり、名前空間 System.Net.Http
oatsoda

16

nugetパッケージがインストールされていることを確認してくださいMicrosoft.AspNet.Identity.Owin。次にSystem.Net.Http名前空間を追加します。


私もそれを食べました。Identityのものをインストールしたときに、インストールされていない別のライブラリがあったことがわかりました。
Darren Wainwright

@Darrenパッケージ名を追加してください。ありがとう
Saturn Technologies

6
@SaturnTechnologies私にとって、他のパッケージはMicrosoft.Owin.Host.SystemWebと名前空間System.Web
WiSeeker

1
私は2番目のWiSeekerです。私にとって、これは役に立ちませんでした。ダレンのインストールの提案Microsoft.Owin.Host.SystemWebは、しかし、トリックをしました。
Max Barraclough

13

ただ使う

HttpContext.Current.GetOwinContext()

私の場合はトリックをしました。


10

Web APIプロジェクトでこのエラーが発生する開発者向け-

GetOwinContext拡張メソッドはSystem.Web.Http.Owindllで定義されており、もう1つのパッケージが必要になりますMicrosoft.Owin.Host.SystemWeb。このパッケージは、nugetからプロジェクトにインストールする必要があります。

パッケージへのリンク:OWINパッケージインストールコマンド-

Install-Package Microsoft.AspNet.WebApi.Owin    

System.webパッケージへのリンク:パッケージインストールコマンド-

Install-Package Microsoft.Owin.Host.SystemWeb

このエラーを解決するには、あなたのケースでそれが発生する理由を見つける必要があります。コードの以下のポイントをクロスチェックしてください-

  1. への参照が必要です Microsoft.AspNet.Identity.Owin;

    Microsoft.AspNet.Identity.Owinを使用します。

  2. 定義GetOwinContext()の下にHttpContext.Current以下のように-

     return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

    または

    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();

GetOwinContext()が使用されている完全なコード-

 public ApplicationSignInManager SignInManager
 {
   get
   {
    return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
   }
    private set
    {
     _signInManager = value;
    }
  }

名前空間は、GetOwinContext()が使用されているコードファイルで使用しています

using AngularJSAuthentication.API.Entities;
using AngularJSAuthentication.API.Models;
using HomeCinema.Common;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using Microsoft.AspNet.Identity.Owin;
using Microsoft.Owin.Security.DataProtection;

あるプロジェクトから別のプロジェクトにコードを移動しているときにこのエラーが発生しました。


4

APIでUserManagerを取得するには

return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();

AppUserManagerは、UserManagerから継承するクラスです。


4

正しいパッケージと使用法はすべて持っていましたがGetOwinContext()、作業に入る前に最初にビルドする必要がありました。


初めて機能するようにビルドをどのように修正しましたか?
Nordes、2015

@Nordes VSはバックグラウンドでのビルドに失敗する場合があります(つまり、コンパイルエラーがあることを通知します)が、実際のビルド(またはより頻繁にクリーンアンドビルド)をトリガーすると、ビルドが成功します。それはおそらくケビンが経験していたことです。
Maverick

0

このパッケージをインストールするだけで、コードが機能します。=> Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.