Impossibile trovare Request.GetOwinContext


101

Ho cercato per un'ora di capire perché non funziona.

Ho un'applicazione ASP.Net MVC 5 con WebAPI. Sto cercando di ottenere Request.GetOwinContext (). Authentication, tuttavia non riesco a trovare come includere GetOwinContext. Ecco il mio codice:

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);
        }
    }
}

Da quello che ho letto, dovrebbe far parte di System.Net.Http, ma l'ho incluso e ancora non si risolve. Anche Ctrl-Space non mi dà alcuna opzione intellisense.

Cosa mi manca qui?


È nello System.Web.Httpspazio dei nomi, ma proviene dalla System.Web.Http.Owindll. Hai fatto riferimento a questo?
Simon C

Ok, ho trovato il pacchetto nuget per Microsoft.AspNet.WebApi.Owin e l'ho installato, includendo gli utilizzi per System.Web.Http e System.Web.Http.Owin, ma ancora non funziona.
Scottie

2
Spiacenti, il mio commento sopra dovrebbe aver letto lo System.Net.Httpspazio dei nomi. Quindi non hai bisogno di un utilizzo per .Owin, solo using System.Net.Httpche hai già.
Simon C

Risposte:


163

Il GetOwinContextmetodo di estensione si trova nella System.Web.Http.Owindll che deve essere scaricata come pacchetto nuget (il nome del pacchetto nuget è Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

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

Pacchetto Nuget qui: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Tuttavia, il metodo fa ancora parte dello System.Net.Httpspazio dei nomi, quindi le usingdefinizioni che hai dovrebbero andare bene.

MODIFICARE

Ok, per chiarire un po 'di confusione: se stai usando un ApiController (cioè MyController : ApiController) avrai bisogno del Microsoft.AspNet.WebApi.Owinpacchetto.

Se stai usando un normale controller Mvc (cioè MyController : Controller) avrai bisogno del Microsoft.Owin.Host.SystemWebpacchetto.

In MVC 5 le pipeline per Api e MVC regolari erano molto diverse, ma spesso hanno le stesse convenzioni di denominazione. Quindi un metodo di estensione in uno non si applica all'altro. Lo stesso per molti dei filtri di azione ecc.


Il secondo collegamento ha funzionato per me. Esegui il pacchetto di installazione Microsoft.AspNet.WebApi.Owin nel tuo gestore di pacchetti.
Rogala

La revoca del token è troppo difficile !!! Ma questa risposta alla fine mi ha aiutato a farlo funzionare (oltre a cancellarlo manualmente dal db, a cui ho accesso). Grazie!!
SlimsGhost

Anch'io ho questo problema ma ho usato il pacchetto di installazione Microsoft.Owin.Host.SystemWeb per risolvere il problema
hmfarimani

1
Non capisco perché questo sia ritenuto corretto: questo metodo di estensione non ha nulla a che fare con WebAPI, e in effetti è dentro Microsoft.Owin.Host.SystemWeb, no Microsoft.AspNet.WebApi.Owin.
John

2
@ John - Se stai utilizzando un controller API, ti serve Microsoft.AspNet.WebApi.Owin. Se sei in un normale controller MVC avrai bisogno di Microsoft.Owin.Host.SystemWeb. L' Requestoggetto è diverso a seconda del tipo di controller utilizzato, quindi un metodo di estensione diverso.
Simon C

49

Nessuno di questi ha funzionato per me. Ho dovuto confrontare i pacchetti Nuget con uno creato con Identity e ho trovato questo pacchetto Nuget mancante che, una volta aggiunto, ha risolto il problema per me

Microsoft.Owin.Host.SystemWeb

Apparentemente ne hai bisogno per eseguire OWIN su IIS utilizzando la pipeline di richieste ASP.NET (leggi che sei fregato senza di essa!)


2
non è necessario eseguire su IIS.
Trevor de Koekkoek

1
@TrevordeKoekkoek si ma se leggi correttamente il commento dice che hai bisogno della libreria per funzionare su IIS (se vuoi girare su IIS non puoi fare a meno di questa libreria)
Obi

1
hai bisogno di quel pacchetto più un using System.Web; dichiarazione.
Murariu Serban

Ha risolto il problema per me. Grazie!
Artorias2718

45

Nell'API WEB, puoi ottenere il riferimento utilizzando quanto segue:

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

funziona in Identity 2.0


5
-1 Ciò richiede la dipendenza da System.Web, che non è disponibile negli scenari self-hosted.
Kugel

6
Dopo tutto questo tempo, le persone usano ancora HttpContext.Current? Non è testabile. contesto dovrebbe essere iniettato.
Trevor de Koekkoek

1
Solo l'installazione del pacchetto Nuget Microsoft.Owin.Host.SystemWeb ha funzionato per me
Himalaya Garg,

21

Potrebbe essere necessario aggiungere il pacchetto NuGet Microsoft.Owin.Host.SystemWebper eseguire questa operazione:

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

7

Nel mio caso devo aggiungere

using Microsoft.AspNet.Identity.Owin;

per risolvere GetOwinContext e quindi GetUserManager nella riga seguente.

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


2

Mi ci è voluta un'eternità per trovare una risposta semplice: ma quello che ho fatto è stato utilizzare l'estensione Get della singola istanza di IOwinContext che è stata istanziata all'avvio. Quindi è uscito così:

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

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

1

Il GetOwinContext()metodo di estensione non si trova in thread diversi dal thread della GUI.

Quindi fai attenzione a non chiamare questa funzione dall'interno di nessuna awaitfunzione ed.


1

Dopo aver esaminato il progetto predefinito ASP.NET, ho scoperto che dovevo includerlo nell'avvio della mia applicazione:

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

Mi mancava il pacchetto: Microsoft.AspNet.WebApi.Owin for ApiControllers. Spero che questo ti aiuti!


1

Ho avuto lo stesso problema e l'ho risolto utilizzando un metodo privato: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Questo ha funzionato alla grande per me.


1

(Si noti che questa risposta è per l'API Web ASP.NET che corrisponde al tag utilizzato nella domanda. Vedere questa domanda se la richiesta riguarda ASP.NET MVC.)

La domanda non specifica come deve essere ospitato il servizio API Web ASP.NET . La finestra di dialogo in questo post indica (enfasi mia):

kichalla ha scritto il 24 ottobre 2014 all'1: 35

Se NON sei un self-hosting, non utilizzare il pacchetto Microsoft.AspNet.WebApi.Owin con IIS ... questo pacchetto dovrebbe essere utilizzato solo con il self hosting .

L'uso del Microsoft.AspNet.WebApi.Owinpacchetto è consigliato nella risposta accettata . In questa risposta sto segnalando cosa ha funzionato per me quando ho ospitato un servizio API Web ASP.NET in IIS .

Innanzitutto, installa il seguente pacchetto NuGet:

Microsoft.Owin.Host.SystemWeb

Server OWIN che consente l'esecuzione di applicazioni basate su OWIN su IIS utilizzando la pipeline di richieste ASP.NET.

(Tieni presente che mentre scrivo, l'ultima versione disponibile di questo pacchetto NuGet è 3.1.0 . Inoltre, nella misura in cui potrebbe essere importante, sto usando Visual Studio 2013 Update 5.)

Dopo aver installato questo pacchetto NuGet, puoi eseguire le seguenti operazioni:

using Microsoft.Owin;
using System.Web;

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

Ora, per far luce su come vengono risolte queste affermazioni. In Visual Studio, se fai clic con il pulsante destro del mouse GetOwinContextsu una delle istruzioni e selezioni "Peek Definition", Visual Studio visualizzerà quanto segue:

// 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);
    }
}

Come puoi vedere, all'interno dello System.Webspazio dei nomi, ci sono due GetOwinContext metodi di estensione:

  • Uno in HttpContextclasse e
  • L'altro in HttpRequestclasse.

Ancora una volta, per coloro che ospitano il loro servizio API Web in IIS, la mia speranza è che questo chiarisca qualsiasi ambiguità riguardo a dove si GetOwinContextpuò trovare una definizione per rispetto a questa data tarda nel 2017.


0

Ho dovuto aggiungere il pacchetto Microsoft.AspNet.Identity.Owin

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.