Identidade do ASP.NET - HttpContext não possui método de extensão para GetOwinContext

384

Fiz o download e executei com êxito o exemplo de identidade do ASP.NET aqui: https://github.com/rustd/AspnetIdentitySample

Agora estou no meio da implementação da estrutura de identidade do ASP.NET no meu projeto e encontrei um problema que me deixou louco o dia todo ...

GetOwinContext() não existe como método de extensão no meu HttpContext

Estou implementando a estrutura de identidade na biblioteca de classes. Eu instalei todas as últimas (versões de pré-lançamento) da estrutura do Identity e tudo - além disso - está funcionando bem.

Tentei implementar o mesmo código que o mesmo direto no meu controlador e encontrei o mesmo problema.

Estou claramente perdendo uma referência em algum lugar, embora não tenha idéia do que ...! ..

O bloco de código que está me matando é:

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

Eu adicionei referências ao seguinte - tentei isso na minha biblioteca de classes e também diretamente no controlador, nenhum deles funciona para mim ...

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

... isso está me deixando louco .... alguma ideia?

ATUALIZAR

Verifiquei as versões do Identity & OWIN na amostra e verifiquei se as mesmas versões estão na minha solução.

Além disso, se eu pesquisar o navegador de objetos na amostra GetOwinContext, posso encontrar o método; no entanto, quando o procuro na minha solução, ele não pode ser encontrado em nenhum lugar ... Preciso ter alguma biblioteca desatualizada, mas posso ' Não encontre!

Darren Wainwright
fonte

Respostas:

713

ARGH!

Encontrei ... não tinha um pacote extra, chamadoMicrosoft.Owin.Host.SystemWeb

Depois que eu procurei e instalei isso, funcionou.

Agora - não tenho certeza se perdi tudo, apesar de não encontrar referência a essa biblioteca ou pacote ao passar por vários tutoriais. Também não foi instalado quando instalei toda essa estrutura de identidade ... Não tenho certeza se era apenas eu ..

EDITAR Embora esteja na Microsoft.Owin.Host.SystemWebmontagem, é um método de extensão no System.Webnamespace, portanto, você precisa ter a referência ao primeiro e ser usingo último.

Darren Wainwright
fonte
6
Obrigado por descobrir isso: estou usando este tutorial asp.net/identity/overview/getting-started/… e é um passo que faltava #
frenchie
23
@ tne - obrigado pelo seu comentário ... apesar de eu mal estar "correndo sem rumo" - eu estava seguindo um tutorial de um recurso confiável; do site asp.net, no entanto. Eles não tiveram essa etapa no tutorial (já foi adicionada) - além disso, o fato de as pessoas estarem votando positivamente nessa resposta e no Q original também indica que eu não era a única com esse problema.
Darren Wainwright
5
@ Darren, é justo. (Percebo que eu poderia ter escrito isso de maneira diferente.) #
276/14
3
Apenas para referência: nuget.org/packages/Microsoft.Owin.Host.SystemWeb/2.1.0
Chris Bohatka
5
Não sei se foi a atualização dessa referência, mas tive que mudar um pouco minha tarefa para var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Atual incluída onde não estava na pergunta).
Ortund
177

Acredito que você precise fazer referência à corrente HttpContextse estiver fora do controlador. Os controladores MVC têm uma referência básica ao contexto atual. No entanto, fora disso, você deve declarar explicitamente que deseja o atualHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Quanto a isso não aparecer, um novo modelo de projeto MVC 5 usando o código que você mostra acima (o IAuthenticationManager) tem as seguintes instruções de uso na parte superior do controlador de conta:

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;

Comentando cada um, parece que GetOwinContext()realmente faz parte do assembly System.Web.Mvc.

Tommy
fonte
Tenho tentado isso e simplesmente não consigo encontrá-lo. - o GetOwinContext () eu quero dizer.
Darren Wainwright
2
@ Darren - Eu brinquei com o modelo de amostra um pouco e pode ter a montagem que está faltando. Parece que você precisará fazer referência a System.Web.Mvcpartir do seu projeto de classe. Quando comentado, que é o que fez HttpContext.GetOwinContext()desconhecido se tornar (e não a Microsoft.Owin.Securitymontagem)
Tommy
Também tenho tentado fazer com que isso funcione diretamente em um controlador - e novamente não consigo encontrá-lo.
precisa saber é o seguinte
19
Isso me tropeçou. Há uma propriedade pública HttpContextna Controllerclasse, portanto, se você herdar disso, HttpContext.GetOwinContext()funcionará conforme o esperado. Se você herdar ApiController, porém, não existe essa propriedade. Portanto, HttpContextfará referência à classe, que exigirá que você use Currentpara acessar uma instância da classe. Portanto, se você copiar / colar o código de um Controller para um ApiController e se perguntar por que não funciona, esta é a resposta para você.
precisa
"Atual" foi o problema para mim
Clique em Ok.
24

Após tentativa e erro comparando as instruções de uso do meu controlador e do controlador de modelo Asp.Net

using System.Web;

Resolvido o problema para mim. Você também precisará adicionar:

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

Para usar o método GetUserManager.

A Microsoft não conseguiu encontrar uma maneira de resolver isso automaticamente com o botão direito e resolver como outras instruções de uso ausentes?

Ronen Festinger
fonte
11
Isso funcionou para mim também. Eu já tinha as bibliotecas de identidade, mas parece precisar do System.Web.
SouthShoreAK
11
Aparentemente, isso tem andado muito, tanto em assemblies quanto em namespaces. Faz com que seja realmente doloroso por ser um método de extensão. Atualizei todas as minhas bibliotecas e esta resposta reflete onde está atualmente.
Shannon 26/03
ah, ye ol' dll inferno em uma nova forma
JustJohn
11
Sim, infelizmente, os métodos de extensão não podem ser resolvidos automaticamente.
Ronen Festinger
22

No meu caso, adicionar a referência Microsoft.AspNet.WebApi.Owin via nuget fez o truque.

DolceVita
fonte
Sim, isso foi feito para mim na versão mais recente atual. O método de extensão é neste pacote, que é Assemby System.Web.Http.Owin e dentro do Namespace System.Net.Http
oatsoda
16

Verifique se você instalou o pacote nuget Microsoft.AspNet.Identity.Owin. Em seguida, adicione System.Net.Httpespaço para nome.

CodeNotFound
fonte
Eu tinha esse também. Acontece que havia outra biblioteca NÃO instalada quando o material Identity foi instalado.
precisa saber é o seguinte
@ Darren Por favor, adicione o nome do pacote. Obrigado
Saturn Technologies
6
@SaturnTechnologies Para mim, o outro pacote foi Microsoft.Owin.Host.SystemWeb e System.Web namespace
WiSeeker
11
Eu segundo WiSeeker. Para mim, isso não ajudou. A sugestão de Darren para instalar Microsoft.Owin.Host.SystemWebfez o truque.
precisa
13

Apenas usando

HttpContext.Current.GetOwinContext ()

fez o truque no meu caso.

Honza P.
fonte
10

Para desenvolvedores que estão recebendo esse erro no Web API Project -

O método de extensão GetOwinContext é definido na System.Web.Http.Owindll e será necessário mais um pacote Microsoft.Owin.Host.SystemWeb. Este pacote precisa ser instalado no seu projeto a partir do nuget.

Link para o pacote : Comando de instalação do pacote OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Link para o pacote System.web : comando de instalação do pacote -

Install-Package Microsoft.Owin.Host.SystemWeb

Para resolver esse erro, você precisa descobrir por que está ocorrendo no seu caso. Verifique os pontos abaixo em seu código -

  1. Você deve ter referência a Microsoft.AspNet.Identity.Owin;

    using Microsoft.AspNet.Identity.Owin;

  2. Defina GetOwinContext()Abaixo HttpContext.Currentcomo abaixo -

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

    OU

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

Código completo Onde GetOwinContext () é usado -

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

Namespace é que estou usando no arquivo de código onde GetOwinContext () é usada

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;

Eu recebi esse erro ao mover meu código de um projeto para outro.

Heemanshu Bhalla
fonte
4

Para obter o UserManager na API

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

onde AppUserManager é a classe que herda do UserManager.

Ashraf Maher
fonte
4

Eu tinha todos os pacotes e utilizações corretos, mas tive que construir primeiro antes de poder começar GetOwinContext()a trabalhar.

Kevin Raffay
fonte
Como você corrigiu sua compilação para fazê-la funcionar pela primeira vez?
Nordes
@ Nordes Às vezes, o VS falha na compilação em segundo plano (ou seja: indica que há erros de compilação), mas o desencadeamento de uma compilação real (ou, mais frequentemente, limpa e depois compilada) o fará passar. Provavelmente, o que Kevin estava passando.
Maverick
0

Basta instalar este pacote e seu código funcionará: => Pacote de Instalação Microsoft.Owin.Host.SystemWeb -Version 2.1.0

Muhammad Ayyaz
fonte