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!

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.


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


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.


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?


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.


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.


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.


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.


4

Para obtener UserManager en API

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

donde AppUserManager es la clase que hereda de UserManager.


4

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


¿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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.