No se puede encontrar Request.GetOwinContext


101

He estado buscando durante una hora tratando de averiguar por qué esto no funciona.

Tengo una aplicación ASP.Net MVC 5 con WebAPI. Estoy tratando de obtener Request.GetOwinContext (). Authentication, sin embargo, parece que no puedo encontrar cómo incluir GetOwinContext. Aquí está mi código:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Net.Http;
using System.Web;
using System.Web.Mvc;
using System.Web.Security;
using TaskPro.Models;

namespace TaskPro.Controllers.api
{
    public class AccountController : ApiController
    {
        [HttpPost]
        [AllowAnonymous]
        public ReturnStatus Login(LoginViewModel model)
        { 
            if (ModelState.IsValid)
            {
                var ctx = Request.GetOwinContext(); // <-- Can't find this

                return ReturnStatus.ReturnStatusSuccess();
            }

            return base.ReturnStatusErrorsFromModelState(ModelState);
        }
    }
}

Por lo que he leído, debería ser parte de System.Net.Http, pero lo he incluido y todavía no se resuelve. Ctrl-Space tampoco me da ninguna opción de intellisense.

¿Que me estoy perdiendo aqui?


Está en el System.Web.Httpespacio de nombres, pero es del System.Web.Http.Owindll. ¿Ha hecho referencia a eso?
Simon C

Ok, encontré el paquete nuget para Microsoft.AspNet.WebApi.Owin y lo instalé, e incluí los usos para System.Web.Http y System.Web.Http.Owin, pero todavía no funciona.
Scottie

2
Lo siento, mi comentario anterior debería haber leído System.Net.Httpespacio de nombres. Así que no necesitas un uso para .Owin, solo using System.Net.Httpque ya tienes.
Simon C

Respuestas:


163

El GetOwinContextmétodo de extensión está en la System.Web.Http.Owindll que debe descargarse como un paquete nuget (el nombre del paquete nuget es Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

Consulte msdn aquí: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Paquete Nuget aquí: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Sin embargo, el método sigue siendo parte del System.Net.Httpespacio de nombres, por lo que las usingdefiniciones que tiene deberían estar bien.

EDITAR

De acuerdo, para aclarar algo de confusión: si está utilizando un ApiController (es decir MyController : ApiController), necesitará el Microsoft.AspNet.WebApi.Owinpaquete.

Si está utilizando un controlador Mvc normal (es decir MyController : Controller), necesitará el Microsoft.Owin.Host.SystemWebpaquete.

En MVC 5, las canalizaciones para Api y MVC regular eran muy diferentes, pero a menudo tienen las mismas convenciones de nomenclatura. Entonces, un método de extensión en uno no se aplica al otro. Lo mismo ocurre con muchos de los filtros de acción, etc.


El segundo enlace funcionó para mí. Simplemente ejecute Install-Package Microsoft.AspNet.WebApi.Owin en su administrador de paquetes.
Rogala

¡La revocación del token es demasiado difícil! Pero esta respuesta finalmente me ayudó a que funcionara (además de eliminarla manualmente de la base de datos, a la que tengo acceso). ¡¡Gracias!!
SlimsGhost

También tengo este problema, pero utilicé el paquete de instalación Microsoft.Owin.Host.SystemWeb para resolver el problema
hmfarimani

1
No entiendo por qué esto se considera que es correcto - este método de extensión no tiene nada que ver con WebAPI, y de hecho lo que está en Microsoft.Owin.Host.SystemWeb, no Microsoft.AspNet.WebApi.Owin.
John

2
@John: si está utilizando un controlador API, necesita Microsoft.AspNet.WebApi.Owin. Si está en un controlador MVC regular, necesitará Microsoft.Owin.Host.SystemWeb. El Requestobjeto es diferente según el tipo de controlador que esté utilizando, por lo que es un método de extensión diferente.
Simon C

49

Ninguno de estos funcionó para mí. Tuve que comparar los paquetes de Nuget con uno que se creó con Identity y encontré que faltaba este paquete de Nuget que, cuando se agregó, solucionó el problema para mí.

Microsoft.Owin.Host.SystemWeb

Aparentemente, lo necesita para ejecutar OWIN en IIS utilizando la canalización de solicitudes ASP.NET (¡lea que está jodido sin él!)


2
no es necesario que se ejecute en IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek sí, pero si lee el comentario correctamente, dice que necesita que la biblioteca se ejecute en IIS (si desea ejecutar en IIS, no puede prescindir de esta biblioteca)
Obi

1
necesita ese paquete más un System.Web; declaración.
Murariu Serban

Me solucionó el problema. ¡Gracias!
Artorias2718

45

En WEB API, puede obtener la referencia utilizando lo siguiente:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

funciona en Identity 2.0


5
-1 Esto requiere dependencia de System.Web, que no está disponible en escenarios autohospedados.
Kugel

6
Después de todo este tiempo, la gente todavía usa HttpContext. ¿Actual? No es comprobable. debe inyectarse el contexto.
Trevor de Koekkoek

1
Solo la instalación del paquete Nuget Microsoft.Owin.Host.SystemWeb funcionó para mí
Himalaya Garg

21

Es posible que deba agregar el paquete NuGet Microsoft.Owin.Host.SystemWebpara hacer esto:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();

7

En mi caso necesito agregar

using Microsoft.AspNet.Identity.Owin;

para resolver GetOwinContext y luego GetUserManager en la siguiente línea.

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();


2

Esto me tomó una eternidad para encontrar una respuesta simple: pero lo que hice fue usar la extensión Get de la única instancia de IOwinContext que fue instanciada en el inicio. Entonces salió así:

private readonly IOwinContext _iOwinContext = HttpContext.Current.GetOwinContext();

public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
        }
        private set
        {
            _userManager = value;
        }
    }

1

El GetOwinContext()método de extensión no se encuentra en subprocesos que no sean el subproceso de la GUI.

Así que tenga cuidado de no llamar a esta función desde ninguna awaitfunción ed.


1

Después de mirar el proyecto predeterminado de ASP.NET, descubrí que necesitaba incluir esto en el inicio de mi aplicación:

// Enable the application to use a cookie to store information for the signed in user
// and to use a cookie to temporarily store information about a user logging in 
// with a third party login provider
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);`

1

Me faltaba el paquete: Microsoft.AspNet.WebApi.Owin para ApiControllers. ¡Espero que esto ayude!


1

Tuve este mismo problema y lo resolví usando un método privado: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Esto funcionó a la perfección para mí.


1

(Tenga en cuenta que esta respuesta es para ASP.NET Web API que corresponde a la etiqueta utilizada en la pregunta. Consulte esta pregunta si su consulta es con respecto a ASP.NET MVC).

La pregunta no especifica cómo el servicio API de ASP.NET Web debe ser acogido . El diálogo en esta publicación indica (el énfasis es mío):

kichalla escribió oct 24, 2014 en 1:35 a.m.

Si NO es autohospedado, no utilice el paquete Microsoft.AspNet.WebApi.Owin con IIS ... se supone que este paquete solo debe usarse con autohospedaje .

Se Microsoft.AspNet.WebApi.Owinrecomienda el uso del paquete en la respuesta aceptada . En esta respuesta, estoy informando lo que me ha funcionado al alojar un servicio de API web ASP.NET en IIS .

Primero, instale el siguiente paquete NuGet:

Microsoft.Owin.Host.SystemWeb

Servidor OWIN que permite que las aplicaciones basadas en OWIN se ejecuten en IIS mediante la canalización de solicitudes ASP.NET.

(Tenga en cuenta que mientras escribo, la última versión disponible de este paquete NuGet es 3.1.0 . Además, en la medida en que pueda importar, estoy usando Visual Studio 2013 Update 5.)

Después de instalar este paquete NuGet, puede hacer lo siguiente:

using Microsoft.Owin;
using System.Web;

IOwinContext context = HttpContext.Current.GetOwinContext();
// or
IOwinContext context = HttpContext.Current.Request.GetOwinContext();

Ahora, para arrojar algo de luz sobre cómo se resuelven estas afirmaciones. En Visual Studio, si hace clic con el botón derecho GetOwinContexten cualquiera de las declaraciones y selecciona "Peek Definition", Visual Studio mostrará lo siguiente:

// Assembly Microsoft.Owin.Host.SystemWeb.dll, v3.1.0.0

using Microsoft.Owin;
using System;
using System.Runtime.CompilerServices;

namespace System.Web
{
    public static class HttpContextExtensions
    {
        public static IOwinContext GetOwinContext(this HttpContext context);
        public static IOwinContext GetOwinContext(this HttpRequest request);
    }
}

Como puede ver, dentro del System.Webespacio de nombres, hay dos GetOwinContext métodos de extensión:

  • Uno en la HttpContextclase, y
  • El otro en la HttpRequestclase.

Nuevamente, para aquellos que alojan su servicio Web API en IIS, espero que esto aclare cualquier ambigüedad con respecto a dónde GetOwinContextse puede encontrar una definición con respecto a esta fecha tardía en 2017.


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.