Não é possível encontrar Request.GetOwinContext


101

Estou procurando há uma hora tentando descobrir por que isso não está funcionando.

Eu tenho um aplicativo ASP.Net MVC 5 com um WebAPI. Estou tentando obter Request.GetOwinContext (). Authentication, mas não consigo descobrir como incluir GetOwinContext. Aqui está o meu 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);
        }
    }
}

Pelo que li, deve ser parte do System.Net.Http, mas incluí isso e ainda não está resolvendo. Ctrl-Espaço também não me dá nenhuma opção de intellisense.

O que estou perdendo aqui?


Está no System.Web.Httpnamespace, mas é da System.Web.Http.Owindll. Você fez referência a isso?
Simon C

Ok, encontrei o pacote nuget para Microsoft.AspNet.WebApi.Owin e instalei-o e incluí os usos de System.Web.Http e System.Web.Http.Owin, mas ainda não está funcionando.
Scottie

2
Desculpe, meu comentário acima deveria ter lido o System.Net.Httpnamespace. Então você não precisa usar o for .Owin, apenas o using System.Net.Httpque você já tem.
Simon C

Respostas:


163

O GetOwinContextmétodo de extensão está na System.Web.Http.Owindll, que precisa ser baixado como um pacote nuget (o nome do pacote nuget é Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

Veja o msdn aqui: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Pacote Nuget aqui: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

No entanto, o método ainda faz parte do System.Net.Httpnamespace, portanto, as usingdefinições que você tem devem ser adequadas.

EDITAR

Ok, para esclarecer alguma confusão: Se você estiver usando um ApiController (ou seja, MyController : ApiController) você precisará do Microsoft.AspNet.WebApi.Owinpacote.

Se você estiver usando um controlador Mvc regular (ou seja, MyController : Controller) você precisará do Microsoft.Owin.Host.SystemWebpacote.

No MVC 5, os pipelines para Api e MVC regular eram muito diferentes, mas geralmente têm as mesmas convenções de nomenclatura. Portanto, um método de extensão em um não se aplica ao outro. O mesmo vale para muitos filtros de ação etc.


O segundo link funcionou para mim. Basta executar o Install-Package Microsoft.AspNet.WebApi.Owin em seu gerenciador de pacotes.
Rogala

A revogação de token é muito difícil !!! Mas essa resposta finalmente me ajudou a fazê-lo funcionar (além de excluí-lo manualmente do banco de dados, ao qual tenho acesso). Obrigado!!
SlimsGhost

Também tenho esse problema, mas usei o Install-Package Microsoft.Owin.Host.SystemWeb para resolver o problema
hmfarimani,

1
Não entendo por que isso é considerado correto - esse método de extensão não tem nada a ver com WebAPI e, na verdade Microsoft.Owin.Host.SystemWeb, não está Microsoft.AspNet.WebApi.Owin.
John

2
@John - Se você está usando um controlador de API, você precisa Microsoft.AspNet.WebApi.Owin. Se você estiver em um controlador MVC regular, você precisará Microsoft.Owin.Host.SystemWeb. O Requestobjeto é diferente dependendo de qual tipo de controlador você está usando, portanto, um método de extensão diferente.
Simon C

49

Nenhum desses funcionou para mim. Tive que comparar os pacotes Nuget com um que foi criado com o Identity e descobri que falta esse pacote Nuget que, quando adicionado, corrigiu o problema para mim

Microsoft.Owin.Host.SystemWeb

Aparentemente, você precisa dele para executar OWIN no IIS usando o pipeline de solicitação ASP.NET (leia, você está ferrado sem ele!)


2
você não precisa executar no IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek sim, mas se você leu o comentário corretamente, ele diz que você precisa da biblioteca para rodar no IIS (se você quiser rodar no IIS você não pode ficar sem esta biblioteca)
Obi

1
você precisa desse pacote mais um using System.Web; declaração.
Murariu Serban de

Ele corrigiu o problema para mim. Obrigado!
Artorias2718

45

Na WEB API, você pode obter a referência usando o seguinte:

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

funciona no Identity 2.0


5
-1 Isso requer dependência de System.Web, que não está disponível em cenários auto-hospedados.
Kugel

6
Depois de todo esse tempo, as pessoas ainda estão usando HttpContext.Current? Não é testável. contexto deve ser injetado.
Trevor de Koekkoek

1
Apenas a instalação do pacote Nuget Microsoft.Owin.Host.SystemWeb funcionou para mim
Himalaya Garg

21

Pode ser necessário adicionar o pacote NuGet Microsoft.Owin.Host.SystemWebpara fazer isso:

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

7

No meu caso, preciso adicionar

using Microsoft.AspNet.Identity.Owin;

para resolver GetOwinContext e, em seguida, GetUserManager na linha a seguir.

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


2

Isso me levou uma eternidade para encontrar uma resposta simples: mas o que fiz foi usar a extensão Get da única instância do IOwinContext que foi instanciado na inicialização. Então ficou assim:

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

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

1

O GetOwinContext()método de extensão não é encontrado em threads diferentes da thread GUI.

Portanto, tome cuidado para não chamar esta função de qualquer awaitfunção ed.


1

Depois de examinar o projeto padrão ASP.NET, descobri que precisava incluir isso na inicialização do meu aplicativo:

// 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

Estava faltando o pacote: Microsoft.AspNet.WebApi.Owin para ApiControllers. Espero que isto ajude!


1

Eu tive o mesmo problema e resolvi usando um método privado: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Isso funcionou perfeitamente para mim.


1

(Observe que esta resposta é para ASP.NET Web API que corresponde à tag usada na pergunta. Consulte esta pergunta se sua pergunta for em relação à ASP.NET MVC.)

A pergunta não especifica como o serviço ASP.NET Web API deve ser hospedado . A caixa de diálogo nesta postagem indica (ênfase minha):

kichalla escreveu em 24 de outubro de 2014 às 01h35

Se você NÃO tem hospedagem própria, não use o pacote Microsoft.AspNet.WebApi.Owin com IIS ... este pacote deve ser usado apenas com hospedagem própria .

O uso do Microsoft.AspNet.WebApi.Owinpacote é recomendado na resposta aceita . Nesta resposta, estou relatando o que funcionou para mim ao hospedar um serviço ASP.NET Web API no IIS .

Primeiro, instale o seguinte pacote NuGet:

Microsoft.Owin.Host.SystemWeb

Servidor OWIN que permite que aplicativos baseados em OWIN sejam executados no IIS usando o pipeline de solicitação ASP.NET.

(Observe que, enquanto escrevo, a versão mais recente disponível deste pacote NuGet é 3.1.0 . Além disso, na medida em que isso pode importar, estou usando o Visual Studio 2013 Atualização 5.)

Depois de instalar este pacote NuGet, você pode fazer o seguinte:

using Microsoft.Owin;
using System.Web;

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

Agora, para lançar alguma luz sobre como essas declarações são resolvidas. No Visual Studio, se você clicar com o botão direito GetOwinContextem uma das instruções e selecionar "Peek Definition", o Visual Studio exibirá o seguinte:

// 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 você pode ver, dentro do System.Webnamespace, existem dois GetOwinContext métodos de extensão:

  • Um na HttpContextclasse, e
  • O outro na HttpRequestclasse.

Novamente, para aqueles que hospedam seu serviço de API da Web no IIS, minha esperança é que isso esclareça qualquer ambigüidade em relação a onde uma definição para GetOwinContextpode ser encontrada com relação a esta data tardia em 2017.


0

Eu tive que adicionar pacote Microsoft.AspNet.Identity.Owin

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.