ASP.NET Identity - HttpContext non ha un metodo di estensione per GetOwinContext


384

Ho scaricato ed eseguito correttamente l'esempio di identità ASP.NET da qui: https://github.com/rustd/AspnetIdentitySample

Ora sono nel mezzo dell'implementazione del framework di identità ASP.NET nel mio progetto e ho riscontrato un problema, che mi ha fatto impazzire tutto il giorno ...

GetOwinContext() non esiste come metodo di estensione sul mio HttpContext

Sto implementando il framework delle identità nella libreria di classi. Ho installato tutte le ultime (versione pre-release) del framework Identity e tutto - a parte questo - funziona bene.

Ho provato a implementare lo stesso codice dello stesso diretto nel mio controller e trovo lo stesso problema.

Mi manca chiaramente un riferimento da qualche parte, anche se non ho idea di cosa ..! ..

Il blocco di codice che mi sta uccidendo è:

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

Ho aggiunto riferimenti a quanto segue: ho provato questi sia nella mia libreria di classi che anche direttamente sul controller, nessuno di loro funziona per me ...

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

... questo mi sta spingendo su per il muro ... qualche idea?

AGGIORNARE

Ho controllato le versioni di Identity & OWIN nell'esempio e mi sono assicurato di avere le stesse versioni nella mia soluzione.

Inoltre, se cerco il browser degli oggetti GetOwinContextnell'esempio, riesco a trovare il metodo, tuttavia quando lo cerco nella mia soluzione non si trova da nessuna parte ... Devo avere una libreria obsoleta, ma posso ' non trovarlo!

Risposte:


713

ARGH!

L'ho trovato ... Non avevo un pacchetto aggiuntivo, chiamatoMicrosoft.Owin.Host.SystemWeb

Una volta cercato e installato, ha funzionato.

Ora, non sono sicuro di aver perso tutto, sebbene non abbia trovato NESSUN riferimento a tale libreria o pacchetto durante i vari tutorial. Inoltre non è stato installato quando ho installato tutto questo framework Identity ... Non sono sicuro se fossi solo io ..

MODIFICA Sebbene sia Microsoft.Owin.Host.SystemWebnell'assieme, è un metodo di estensione nello System.Webspazio dei nomi, quindi è necessario avere il riferimento al primo ed essere usingil secondo.


6
Grazie per averlo capito: sto usando questo tutorial asp.net/identity/overview/getting-started/… ed è un passo mancante
frenchie

23
@tne - grazie per il tuo commento ... anche se non stavo "correndo senza meta" - seguivo un tutorial da una risorsa affidabile; dal sito asp.net non meno. Non hanno fatto questo passo nel loro tutorial (è stato aggiunto da allora) - inoltre, il fatto che le persone stiano votando sia questa risposta che la Q originale indica anche che non ero l'unico con questo problema.
Darren Wainwright,

5
@Darren, abbastanza giusto. (Mi rendo conto che avrei potuto formulato che in modo diverso.)
TNE


5
Non so se è stato dall'aggiornamento di questo riferimento, ma ho dovuto modificare un po 'il mio compito in var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Corrente inclusa dove non era presente nella domanda).
Ortund,

177

Credo che sia necessario fare riferimento alla corrente HttpContextse si è al di fuori del controller. I controller MVC hanno un riferimento di base al contesto corrente. Tuttavia, a parte questo, devi dichiarare esplicitamente che vuoi la correnteHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Per quanto riguarda il fatto che non venga visualizzato, un nuovo modello di progetto MVC 5 che utilizza il codice che mostri sopra (il IAuthenticationManager) ha le seguenti istruzioni using nella parte superiore del controller account:

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;

Commentando ognuno di essi, sembra che in GetOwinContext()realtà faccia parte dell'assemblaggio System.Web.Mvc.


Ci ho provato e non riesco a trovarlo. - intendo GetOwinContext ().
Darren Wainwright,

2
@Darren - Ho giocato un po 'con il modello di esempio e potrei avere l'assemblaggio che ti manca. Sembra che dovrai fare riferimento System.Web.Mvcal tuo progetto di classe. Quando viene commentato, questo è ciò che ha reso HttpContext.GetOwinContext()sconosciuto (e non l' Microsoft.Owin.Securityassemblea)
Tommy,

Ho cercato di farlo funzionare anche direttamente su un controller - e di nuovo non riesco a trovarlo.
Darren Wainwright,

19
Questo mi ha fatto inciampare. C'è una proprietà pubblica HttpContextsulla Controllerclasse, quindi se erediti da quella, HttpContext.GetOwinContext()funziona come previsto. Se erediti da ApiControllerperò, non esiste tale proprietà. Pertanto, HttpContextfarà riferimento alla classe, che richiederà di utilizzare Currentper accedere a un'istanza della classe. Quindi se copi / incolli il codice da un controller ad un ApiController e ti chiedi perché non funziona, questa è la risposta per te.
David Miani,

"Current" è stato il gotcha per me
Fai clic su Ok

24

Dopo tentativi ed errori confrontando le istruzioni using del mio controller e del controller del modello Asp.Net

using System.Web;

Risolto il problema per me Dovrai anche aggiungere:

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

Per utilizzare il metodo GetUserManager.

Microsoft non è riuscita a trovare un modo per risolverlo automaticamente con il clic destro e risolvere come altre dichiarazioni mancanti mancanti?


1
Questo ha funzionato anche per me. Avevo già le librerie Identity, ma sembra che abbia bisogno di System.Web.
SouthShoreAK,

1
Apparentemente questo si è spostato molto, sia negli assiemi che negli spazi dei nomi. Lo rende davvero doloroso perché è un metodo di estensione. Ho aggiornato tutte le mie librerie e questa risposta riflette dove si trova attualmente.
Shannon,

ah, vecchio inferno in una nuova forma
JustJohn

1
Sì, purtroppo, i metodi di estensione non possono essere risolti automaticamente.
Ronen Festinger,

22

Nel mio caso l'aggiunta del riferimento Microsoft.AspNet.WebApi.Owin tramite nuget ha funzionato.


Sì, questo è stato per me nell'ultima versione attuale. Il metodo di estensione è in questo pacchetto, che è Assemby System.Web.Http.Owin e all'interno di Namespace System.Net.Http
oatsoda

16

Assicurati di aver installato il pacchetto nuget Microsoft.AspNet.Identity.Owin. Quindi aggiungi lo System.Net.Httpspazio dei nomi.


Ho avuto anche quello. Si scopre che c'era un'altra libreria NON installata quando è stato installato il materiale Identity.
Darren Wainwright,

@Darren Aggiungi il nome del pacchetto. Grazie
Saturn Technologies,

6
@SaturnTechnologies Per me, l'altro pacchetto era Microsoft.Owin.Host.SystemWeb e namespace System.Web
WiSeeker

1
Io secondo WiSeeker. Per me questo non ha aiutato. Il suggerimento di Darren di installare Microsoft.Owin.Host.SystemWebha funzionato però.
Max Barraclough,

13

Sto solo usando

HttpContext.Current.GetOwinContext ()

ha fatto il trucco nel mio caso.


10

Per gli sviluppatori che ottengono questo errore nel progetto API Web -

Il metodo di estensione GetOwinContext è definito in System.Web.Http.Owindll e sarà necessario un altro pacchetto, ad es Microsoft.Owin.Host.SystemWeb. Questo pacchetto deve essere installato nel tuo progetto da nuget.

Collegamento al pacchetto : comando di installazione pacchetto OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Collegamento al pacchetto System.web : comando di installazione pacchetto -

Install-Package Microsoft.Owin.Host.SystemWeb

Per risolvere questo errore devi scoprire perché si verifica nel tuo caso. Si prega di controllare i punti seguenti nel codice -

  1. Devi avere riferimento a Microsoft.AspNet.Identity.Owin;

    utilizzando Microsoft.AspNet.Identity.Owin;

  2. Definisci GetOwinContext()sotto HttpContext.Currentcome di seguito -

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

    O

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

Codice completo dove viene utilizzato GetOwinContext () -

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

Lo spazio dei nomi che sto usando nel file di codice in cui viene utilizzato 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;

Ho riscontrato questo errore durante lo spostamento del codice da un progetto a un altro.


4

Per ottenere UserManager nell'API

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

dove AppUserManager è la classe che eredita da UserManager.


4

Avevo tutti i pacchetti e gli usi corretti, ma dovevo costruirli prima di poter GetOwinContext()lavorare.


Come hai corretto la tua build per farla funzionare la prima volta?
Nordes,

@Nordes A volte VS non riesce a compilare in background (cioè: ti dice che ci sono errori di compilazione), ma innescando una build reale (o più spesso clean e quindi build) la supererà. Questo è probabilmente quello che stava vivendo Kevin.
Maverick,

0

Basta installare questo pacchetto e il codice funzionerà: => Pacchetto di installazione Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.