Identidad ASP.NET: HttpContext no tiene un método de extensión para GetOwinContext

384

He descargado y ejecuté con éxito el ejemplo de identidad ASP.NET desde aquí: https://github.com/rustd/AspnetIdentitySample

Ahora estoy en medio de la implementación del marco de identidad ASP.NET en mi proyecto y me he encontrado con un problema que me ha vuelto loco todo el día ...

GetOwinContext() no existe como un método de extensión en mi HttpContext

Estoy implementando el marco de identidad en la biblioteca de clases. He instalado la última versión (versión preliminar) del marco de Identity y todo, aparte de esto, está funcionando bien.

He intentado implementar el mismo código que el mismo directo en mi controlador y encuentro el mismo problema.

Claramente me falta una referencia en alguna parte, ¡aunque no tengo idea de qué ...! ..

El bloque de código que me está matando es:

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

He agregado referencias a lo siguiente: probé ambos en mi biblioteca de clases y también directamente en el controlador, ninguno de ellos funciona para mí ...

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

... esto me está volviendo loco ... ¿alguna idea?

ACTUALIZAR

Verifiqué las versiones de Identity & OWIN en la muestra y me aseguré de tener las mismas versiones en mi solución.

Más aún, si busco el buscador de objetos en la muestra GetOwinContext, puedo encontrar el método, sin embargo, cuando lo busco en mi solución, no se encuentra en ninguna parte ... Debo tener alguna biblioteca desactualizada, pero puedo ' no lo encuentre!

Darren Wainwright
fuente

Respuestas:

713

ARGH!

Lo encontré ... No tenía un paquete adicional, llamadoMicrosoft.Owin.Host.SystemWeb

Una vez que busqué e instalé esto, funcionó.

Ahora, no estoy seguro de si me lo perdí todo, aunque NO encontré ninguna referencia a dicha biblioteca o paquete cuando revisé varios tutoriales. Tampoco se instaló cuando instalé todo este marco de identidad ... No estoy seguro si solo fui yo ...

EDITAR Aunque está en el Microsoft.Owin.Host.SystemWebensamblaje, es un método de extensión en el System.Webespacio de nombres, por lo que debe tener la referencia al primero y ser usingel último.

Darren Wainwright
fuente
66
Gracias por descubrirlo: estoy usando este tutorial asp.net/identity/overview/getting-started/… y es un paso que falta
frenchie
23
@tne - gracias por tu comentario ... aunque apenas estaba 'corriendo sin rumbo' - seguía un tutorial de un recurso confiable; del sitio asp.net no-less. No tuvieron ese paso en su tutorial (desde que se agregó), también, el hecho de que la gente está votando tanto esta respuesta como la Q original también indica que no fui el único con este problema.
Darren Wainwright
55
@ Darren, bastante justo. (Me doy cuenta de que podría haber redactado que de otra manera.)
TNE
3
Solo para referencia: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka
55
No sé si fue por actualizar esta referencia, pero tuve que cambiar mi asignación un poco a var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Actual incluido donde no estaba en la pregunta).
Ortund
177

Creo que debe hacer referencia a la corriente HttpContextsi está fuera del controlador. Los controladores MVC tienen una referencia base al contexto actual. Sin embargo, aparte de eso, debe declarar explícitamente que desea el actualHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

En cuanto a que no aparece, una nueva plantilla de proyecto MVC 5 que usa el código que muestra arriba (el IAuthenticationManager) tiene las siguientes declaraciones de uso en la parte superior del controlador de cuenta:

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;

Al comentar cada uno, parece GetOwinContext()que en realidad es parte del ensamblaje System.Web.Mvc.

Tommy
fuente
He estado intentando esto y simplemente no puedo encontrarlo. - Me refiero al GetOwinContext ().
Darren Wainwright
2
@Darren: jugué un poco con la plantilla de muestra y es posible que tenga el ensamblado que te falta. Parece que tendrá que hacer referencia System.Web.Mvca su proyecto de clase. Cuando se comentó, eso es lo que hizo que se HttpContext.GetOwinContext()volviera desconocido (y no la Microsoft.Owin.Securityasamblea)
Tommy
He estado tratando de hacer que esto funcione directamente en un controlador también, y nuevamente no puedo encontrarlo.
Darren Wainwright
19
Esto me hizo tropezar. Hay una propiedad pública HttpContexten la Controllerclase, por lo que si hereda de eso, HttpContext.GetOwinContext()funciona como se esperaba. Sin ApiControllerembargo, si hereda de , no existe tal propiedad. Por lo tanto, HttpContextse referirá a la clase, que requerirá que use Currentpara acceder a una instancia de la clase. Entonces, si copia / pega el código de un Controlador a un ApiController y se pregunta por qué no funciona, esta es la respuesta para usted.
David Miani
"Actual" fue el problema para mí
haga clic en Aceptar
24

Después de la prueba y error al comparar las declaraciones de uso de mi controlador y el controlador Asp.Net Template

using System.Web;

Resolvió el problema para mí. También necesitará agregar:

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

Para usar el método GetUserManager.

¿Microsoft no pudo encontrar una manera de resolver esto automáticamente con un clic derecho y resolver como otras declaraciones que faltan?

Ronen Festinger
fuente
1
Esto funcionó para mí también. Ya tenía las bibliotecas de Identidad, pero parece necesitar System.Web.
SouthShoreAK
1
Aparentemente, esto se ha estado moviendo mucho, tanto en ensamblados como en espacios de nombres. Lo hace realmente doloroso ya que es un método de extensión. He actualizado todas mis bibliotecas y esta respuesta refleja dónde está actualmente.
shannon
ah, el viejo infierno en una nueva forma
JustJohn
1
Sí, lamentablemente, los métodos de extensión no pueden resolverse automáticamente.
Ronen Festinger el
22

En mi caso, agregar Microsoft.AspNet.WebApi.Owin referencia a través de nuget hizo el truco.

Dulce vida
fuente
Sí, esto lo hizo por mí en la última versión actual. El método de extensión está en este paquete, que es Assemby System.Web.Http.Owin y dentro del espacio de nombres System.Net.Http
oatsoda
16

Asegúrese de haber instalado el paquete nuget Microsoft.AspNet.Identity.Owin. Luego agregue System.Net.Httpespacio de nombres.

CodeNotFound
fuente
Yo también tuve esa. Resulta que no había otra biblioteca instalada cuando se instaló el material de identidad.
Darren Wainwright
@ Darren Por favor agregue el nombre del paquete. Gracias
Saturn Technologies
66
@SaturnTechnologies Para mí, el otro paquete era Microsoft.Owin.Host.SystemWeb y el espacio de nombres System.Web
WiSeeker
1
Yo segundo WiSeeker. Para mí, esto no ayudó. Sin Microsoft.Owin.Host.SystemWebembargo, la sugerencia de Darren de instalar hizo el truco.
Max Barraclough
13

Solo usando

HttpContext.Current.GetOwinContext ()

hizo el truco en mi caso.

Honza P.
fuente
10

Para los desarrolladores que obtienen este error en el proyecto de API web:

El método de extensión GetOwinContext se define en System.Web.Http.Owindll y se necesitará un paquete más, es decir Microsoft.Owin.Host.SystemWeb. Este paquete debe instalarse en su proyecto desde nuget.

Enlace al paquete : Comando de instalación del paquete OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Enlace al paquete System.web : Comando de instalación del paquete -

Install-Package Microsoft.Owin.Host.SystemWeb

Para resolver este error, debe averiguar por qué ocurre en su caso. Verifique los puntos siguientes en su código:

  1. Debe tener referencia a Microsoft.AspNet.Identity.Owin;

    usando Microsoft.AspNet.Identity.Owin;

  2. Definir GetOwinContext()debajo HttpContext.Currentcomo abajo -

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

    O

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

Código completo donde se usa GetOwinContext () -

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

Espacio de nombres que estoy usando en el archivo de código donde se usa 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;

Recibí este error al mover mi código de mi proyecto a otro.

Heemanshu Bhalla
fuente
4

Para obtener UserManager en API

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

donde AppUserManager es la clase que hereda de UserManager.

Ashraf Maher
fuente
4

Tenía todos los paquetes y usos correctos, pero tuve que construir primero antes de poder GetOwinContext()trabajar.

Kevin Raffay
fuente
¿Cómo arreglaste tu construcción para que funcione la primera vez?
Nordes
@Nordes A veces VS no puede compilar en segundo plano (es decir: le dice que hay errores de compilación), pero desencadenar una compilación real (o más a menudo limpia y luego compilar). Eso es probablemente lo que Kevin estaba experimentando.
Maverick
0

Simplemente instale este paquete y su código funcionará: => Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Muhammad Ayyaz
fuente