ASP.NET Identity - HttpContext tidak memiliki metode ekstensi untuk GetOwinContext

384

Saya telah mengunduh, dan berhasil menjalankan sampel ASP.NET Identity dari sini: https://github.com/rustd/AspnetIdentitySample

Saya sekarang berada di tengah penerapan kerangka ASP.NET Identity dalam proyek saya dan telah mengalami masalah, yang membuat saya gila sepanjang hari ...

GetOwinContext() tidak ada sebagai metode ekstensi di blog saya HttpContext

Saya menerapkan kerangka identitas di perpustakaan kelas. Saya telah menginstal semua (versi pra-rilis) terbaru dari kerangka kerja Identity dan semuanya - selain ini - berfungsi dengan baik.

Saya telah mencoba menerapkan kode yang sama dengan langsung yang sama di controller saya, dan menemukan masalah yang sama.

Saya jelas kehilangan referensi di suatu tempat, meskipun saya tidak tahu apa ..! ..

Blok-kode yang membunuh saya adalah:

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

Saya telah menambahkan referensi ke yang berikut - mencoba keduanya di perpustakaan kelas saya dan juga mengarahkan pada controller, tidak ada yang bekerja untuk saya ...

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

... ini membuat saya naik tembok .... ada ide?

MEMPERBARUI

Saya telah memeriksa versi Identity & OWIN dalam sampel, dan saya telah memastikan saya memiliki versi yang sama dalam solusi saya.

Terlebih lagi, jika saya mencari objek browser pada sampel untuk GetOwinContextsaya dapat menemukan metode, namun ketika saya mencarinya dalam solusi saya itu tidak ditemukan ... Saya harus memiliki beberapa perpustakaan yang ketinggalan zaman, tetapi saya bisa ' t menemukannya!

Darren Wainwright
sumber

Jawaban:

713

ARGH!

Saya menemukannya ... Saya tidak punya paket tambahan, disebutMicrosoft.Owin.Host.SystemWeb

Setelah saya mencari dan menginstal ini, itu berhasil.

Sekarang - saya tidak yakin apakah saya melewatkan semuanya, meskipun TIDAK menemukan referensi ke perpustakaan atau paket seperti itu ketika melalui berbagai tutorial. Itu juga tidak diinstal ketika saya menginstal semua kerangka kerja Identity ini ... Tidak yakin apakah itu hanya saya ..

EDIT Meskipun dalam Microsoft.Owin.Host.SystemWebperakitan itu adalah metode ekstensi di System.Webnamespace, jadi Anda harus memiliki referensi ke yang pertama, dan menjadi usingyang terakhir.

Darren Wainwright
sumber
6
Terima kasih telah mengetahui yang keluar: Saya menggunakan tutorial ini asp.net/identity/overview/getting-started/… dan ini merupakan langkah yang hilang
frenchie
23
@tne - terima kasih atas komentar Anda ... meskipun saya hampir 'berlarian tanpa tujuan' - saya mengikuti tutorial dari sumber terpercaya; dari situs asp.net tidak kurang. Mereka tidak memiliki langkah itu dalam tutorial mereka (sudah ditambahkan) - juga, fakta bahwa orang-orang menjawab baik jawaban ini dan Q asli juga menunjukkan bahwa saya bukan satu-satunya yang memiliki masalah ini.
Darren Wainwright
5
@ Darren, cukup adil. (Saya benar-benar sadar bahwa saya dapat mengucapkannya secara berbeda.)
tt
3
Hanya untuk referensi: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka
5
Tidak tahu apakah ini dari memperbarui referensi ini, tetapi saya harus sedikit mengubah tugas saya menjadi var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Termasuk saat ini di mana tidak ada dalam pertanyaan).
Ortund
177

Saya percaya Anda perlu referensi arus HttpContextjika Anda berada di luar controller. Pengontrol MVC memiliki referensi dasar untuk konteks saat ini. Namun, di luar itu, Anda harus secara eksplisit menyatakan Anda menginginkan yang sekarangHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Karena tidak muncul, template proyek MVC 5 baru menggunakan kode yang Anda tunjukkan di atas (the IAuthenticationManager) memiliki pernyataan menggunakan berikut di bagian atas pengontrol akun:

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;

Mengomentari masing-masing, tampaknya GetOwinContext()sebenarnya adalah bagian dari perakitan System.Web.Mvc.

Tommy
sumber
Telah mencoba ini dan tidak dapat menemukannya. - the GetOwinContext () maksud saya.
Darren Wainwright
2
@ Darren - Saya bermain dengan contoh template sedikit dan mungkin ada perakitan yang Anda lewatkan. Sepertinya Anda perlu referensi System.Web.Mvcdari proyek kelas Anda. Ketika dikomentari, itulah yang membuat HttpContext.GetOwinContext()menjadi tidak diketahui (dan bukan Microsoft.Owin.Securitymajelis)
Tommy
Saya sudah mencoba untuk mendapatkan ini untuk bekerja secara langsung pada pengontrol juga - dan sekali lagi tidak dapat menemukannya.
Darren Wainwright
19
Ini membuat saya tersandung. Ada properti publik HttpContextdi Controllerkelas, jadi jika Anda mewarisi itu, HttpContext.GetOwinContext()berfungsi seperti yang diharapkan. Jika Anda mewarisi dari ApiControllersana, tidak ada properti seperti itu. Oleh karena itu, HttpContextakan merujuk ke kelas, yang mengharuskan Anda untuk menggunakan Currentinstance kelas. Jadi jika Anda menyalin / menempelkan kode dari Controller ke ApiController dan bertanya-tanya mengapa itu tidak berhasil, ini adalah jawaban untuk Anda.
David Miani
"Saat ini" adalah gotcha bagi saya
Klik Oke
24

Setelah coba-coba membandingkan pernyataan penggunaan controller saya dan controller Template Asp.Net

using System.Web;

Memecahkan masalah bagi saya. Anda juga perlu menambahkan:

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

Untuk menggunakan metode GetUserManager.

Microsoft tidak dapat menemukan cara untuk menyelesaikan ini secara otomatis dengan klik kanan dan atasi seperti pernyataan penggunaan lainnya yang hilang?

Ronen Festinger
sumber
1
Ini juga bekerja untuk saya. Saya sudah memiliki perpustakaan Identity, tetapi tampaknya membutuhkan System.Web.
SouthShoreAK
1
Ini tampaknya telah banyak bergerak, baik dalam majelis dan ruang nama. Membuatnya sangat menyakitkan dengan itu menjadi metode ekstensi. Saya telah memperbarui semua perpustakaan saya dan jawaban ini mencerminkan di mana itu saat ini.
shannon
ah, kamu ol dll neraka dalam bentuk baru
JustJohn
1
Ya, sayangnya, metode ekstensi tidak dapat diselesaikan secara otomatis.
Ronen Festinger
22

Dalam kasus saya menambahkan referensi Microsoft.AspNet.WebApi.Owin via nuget melakukan trik.

DolceVita
sumber
Ya, ini berhasil untuk saya pada versi terbaru saat ini. Metode ekstensi ada dalam Paket ini, yaitu Assemby System.Web.Http.Owin dan di dalam Namespace System.Net.Http
oatsoda
16

Pastikan Anda menginstal paket nuget Microsoft.AspNet.Identity.Owin. Kemudian tambahkan System.Net.Httpnamespace.

CodeNotFound
sumber
Saya juga memilikinya. Ternyata ada perpustakaan lain TIDAK diinstal ketika hal-hal Identitas diinstal.
Darren Wainwright
@ Darren Silakan tambahkan nama paket. Terima kasih
Saturn Technologies
6
@SaturnTechnologies Bagi saya, paket lainnya adalah Microsoft.Owin.Host.SystemWeb dan namespace System.Web
WiSeeker
1
Saya WiSeeker kedua. Bagi saya, ini tidak membantu. Namun saran Darren untuk menginstal Microsoft.Owin.Host.SystemWebsudah cukup.
Max Barraclough
13

Hanya menggunakan

HttpContext.Current.GetOwinContext ()

melakukan trik dalam kasus saya.

Honza P.
sumber
10

Untuk Pengembang mendapatkan kesalahan ini di Proyek Web API -

Metode ekstensi GetOwinContext didefinisikan dalam System.Web.Http.Owindll dan satu paket lagi akan diperlukan yaitu Microsoft.Owin.Host.SystemWeb. Paket ini perlu diinstal di proyek Anda dari nuget.

Tautan Ke Paket : Perintah Instal Paket OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Tautan ke Paket System.web : Perintah Instal Paket -

Install-Package Microsoft.Owin.Host.SystemWeb

Untuk mengatasi kesalahan ini, Anda perlu mencari tahu mengapa hal ini terjadi pada Anda. Silakan Silang periksa poin di bawah ini dalam kode Anda -

  1. Anda harus memiliki referensi Microsoft.AspNet.Identity.Owin;

    menggunakan Microsoft.AspNet.Identity.Owin;

  2. Tetapkan GetOwinContext()Di Bawah HttpContext.Currentseperti di bawah ini -

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

    ATAU

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

Kode Lengkap Di mana GetOwinContext () digunakan -

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

Namespace's Saya Menggunakan dalam File Kode di mana GetOwinContext () Digunakan

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;

Saya mendapatkan kesalahan ini saat memindahkan kode saya dari satu proyek saya ke yang lain.

Heemanshu Bhalla
sumber
4

Untuk mendapatkan UserManager di API

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

di mana AppUserManager adalah kelas yang mewarisi dari UserManager.

Ashraf Maher
sumber
4

Saya memiliki semua paket dan penggunaan yang benar, tetapi harus dibangun terlebih dahulu sebelum saya mulai GetOwinContext()bekerja.

Kevin Raffay
sumber
Bagaimana Anda memperbaiki bangunan Anda untuk membuatnya berfungsi pertama kali?
Nordes
@Nordes Terkadang VS gagal membangun di latar belakang (yaitu: itu memberitahu Anda ada kesalahan kompilasi), tetapi memicu membangun nyata (atau lebih sering bersih dan kemudian membangun) akan menyelesaikannya. Sepertinya itulah yang dialami Kevin.
Maverick
0

Cukup instal paket ini dan kode Anda akan berfungsi: => Instal-Paket Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Muhammad Ayyaz
sumber