Не удается найти Request.GetOwinContext

101

Я час искал, пытаясь понять, почему это не работает.

У меня есть приложение ASP.Net MVC 5 с WebAPI. Я пытаюсь получить Request.GetOwinContext (). Authentication, однако не могу найти, как включить GetOwinContext. Вот мой код:

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

Из того, что я прочитал, он должен быть частью System.Net.Http, но я включил это, и он все еще не решается. Ctrl-Space также не дает мне никаких опций intellisense.

Что мне здесь не хватает?

Скотти
источник
Он находится в System.Web.Httpпространстве имен, но из System.Web.Http.Owindll. Вы упомянули об этом?
Simon C
Хорошо, я нашел пакет nuget для Microsoft.AspNet.WebApi.Owin и установил его, а также включил использование System.Web.Http и System.Web.Http.Owin, но он все еще не работает.
Скотти
2
Извините, мой комментарий выше должен был читать System.Net.Httpпространство имен. Таким образом, вам не нужно использовать для .Owin, using System.Net.Httpкоторое у вас уже есть.
Simon C
возможный дубликат ASP.Net Identity - HttpContext не имеет метода расширения для GetOwinContext
Даррен Уэйнрайт

Ответы:

162

Метод GetOwinContextрасширения находится в System.Web.Http.Owindll, который необходимо загрузить как пакет nuget (имя пакета nuget - Microsoft.AspNet.WebApi.Owin)

Install-Package Microsoft.AspNet.WebApi.Owin

См. Msdn здесь: http://msdn.microsoft.com/en-us/library/system.net.http.owinhttprequestmessageextensions.getowincontext(v=vs.118).aspx

Пакет Nuget здесь: https://www.nuget.org/packages/Microsoft.AspNet.WebApi.Owin

Однако метод по-прежнему является частью System.Net.Httpпространства имен, так что usingопределения, которые у вас есть, должны быть в порядке.

РЕДАКТИРОВАТЬ

Хорошо, чтобы прояснить некоторую путаницу: если вы используете ApiController (т.е. MyController : ApiController), вам потребуется Microsoft.AspNet.WebApi.Owinпакет.

Если вы используете обычный контроллер Mvc (т.е. MyController : Controller), вам понадобится Microsoft.Owin.Host.SystemWebпакет.

В MVC 5 конвейеры для Api и обычного MVC сильно различались, но часто имеют одинаковые соглашения об именах. Таким образом, метод расширения в одном не применим к другому. То же самое для многих фильтров действий и т. Д.

Саймон С
источник
Вторая ссылка у меня сработала. Просто запустите Install-Package Microsoft.AspNet.WebApi.Owin в своем диспетчере пакетов.
Rogala
Отзыв токена слишком сложен !!! Но этот ответ, наконец, помог мне заставить его работать (плюс вручную удалил его из базы данных, к которой у меня есть доступ). Спасибо!!
SlimsGhost
У меня тоже есть эта проблема, но я использовал Install-Package Microsoft.Owin.Host.SystemWeb для решения проблемы
hmfarimani,
1
Я не понимаю, почему это считается правильным - этот метод расширения не имеет ничего общего с WebAPI, и действительно, он находится в Microsoft.Owin.Host.SystemWeb не Microsoft.AspNet.WebApi.Owin.
Джон
2
@John - Если вы используете контроллер API, который вам нужен Microsoft.AspNet.WebApi.Owin. Если вы используете обычный контроллер MVC, вам понадобится Microsoft.Owin.Host.SystemWeb. RequestОбъект отличается в зависимости от того, какого типа контроллера вы используете так другой метод расширения.
Simon C
50

У меня ничего из этого не сработало. Мне пришлось сравнить пакеты Nuget с пакетом, созданным с помощью Identity, и я обнаружил, что этот пакет Nuget отсутствует, который при добавлении устранил проблему для меня.

Microsoft.Owin.Host.SystemWeb

По-видимому, он вам нужен для запуска OWIN в IIS с использованием конвейера запросов ASP.NET (читайте, что вы облажались без него!)

Оби
источник
2
вам не нужно запускать IIS.
Trevor de Koekkoek
1
@TrevordeKoekkoek, да, но если вы правильно прочитали комментарий, в нем говорится, что вам нужна библиотека для работы в IIS (если вы хотите работать в IIS, вы не можете обойтись без этой библиотеки)
Оби
1
вам нужен этот пакет плюс using System.Web; заявление.
Murariu Serban
Это устранило проблему для меня. Спасибо!
Artorias2718
45

В WEB API вы можете получить ссылку, используя следующее:

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

он работает в Identity 2.0

user3572087
источник
5
-1 Для этого требуется зависимость от System.Web, которая недоступна в сценариях с самостоятельным размещением.
Kugel
6
Спустя столько времени люди все еще используют HttpContext.Current? Это не поддается проверке. контекст должен быть введен.
Trevor de Koekkoek
1
У меня сработала только установка пакета Nuget Microsoft.Owin.Host.SystemWeb
Himalaya Garg
21

Для этого вам может потребоваться добавить пакет NuGet Microsoft.Owin.Host.SystemWeb:

HttpContext.Current.GetOwinContext().GetUserManager<ApplicationUserManager>();
Серж Саган
источник
7

В моем случае мне нужно добавить

using Microsoft.AspNet.Identity.Owin;

для разрешения GetOwinContext, а затем GetUserManager в следующей строке.

Request.GetOwinContext().GetUserManager<ApplicationUserManager>();
Мухаммад Рамзан
источник
5

У меня есть эта проблема, и я загружаю дополнительный пакет из nuget, чтобы решить свою проблему (выполните следующую команду в консоли диспетчера пакетов) Install-Package Microsoft.Owin.Host.SystemWeb

хмфаримани
источник
1
Это было решение и для меня - Консольное приложение Framework 4.6.2
Serexx
2

Мне потребовалась вечность, чтобы найти простой ответ: но я использовал расширение Get для единственного экземпляра IOwinContext, который был создан при запуске. Так получилось:

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

public ApplicationUserManager UserManager
    {
        get
        {
            return _userManager ?? _iOwinContext.Get<ApplicationUserManager>() ;
        }
        private set
        {
            _userManager = value;
        }
    }
bigmike3d
источник
2

(Обратите внимание, что этот ответ предназначен для веб-API ASP.NET, который соответствует тегу, используемому в вопросе. См. Этот вопрос если ваш запрос относится к ASP.NET MVC.)

Вопрос не определяет , как служба ASP.NET Web API должен быть организовано . Диалог в этом сообщении указывает (выделено мной):

kichalla написал 24 октября 2014 г. в 1:35

Если вы НЕ размещаете на собственном хостинге, не используйте пакет Microsoft.AspNet.WebApi.Owin с IIS ... этот пакет должен использоваться только с собственным хостингом .

В принятом ответеMicrosoft.AspNet.WebApi.Owin рекомендуется использовать пакет . В этом ответе я сообщаю, что сработало для меня при размещении службы веб-API ASP.NET в IIS. .

Сначала установите следующий пакет NuGet:

Microsoft.Owin.Host.SystemWeb

Сервер OWIN, который позволяет приложениям на основе OWIN работать в IIS с помощью конвейера запросов ASP.NET.

(Обратите внимание, что на момент написания последней доступной версией этого пакета NuGet является 3.1.0 . Кроме того, насколько это может иметь значение, я использую Visual Studio 2013 Update 5.)

После установки этого пакета NuGet вы можете сделать следующее:

using Microsoft.Owin;
using System.Web;

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

Теперь, чтобы пролить свет на то, как разрешаются эти заявления. Если в Visual Studio щелкнуть правой кнопкой мыши GetOwinContextлюбой оператор и выбрать «Peek Definition», Visual Studio отобразит следующее:

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

Как видите, в System.Webпространстве имен есть два GetOwinContext метода расширения:

  • Один в HttpContextклассе, и
  • Другой по HttpRequestклассу.

Опять же, для тех, кто размещает свою службу веб-API в IIS, я надеюсь, что это устранит любую двусмысленность в отношении того, где можно найти определение для GetOwinContextэтой поздней даты в 2017 году.

DavidRR
источник
1

Метод GetOwinContext()расширения не встречается в потоках, кроме потока графического интерфейса.

Поэтому будьте осторожны, не вызывайте эту функцию из любой awaitфункции ed.

AxD
источник
1

Посмотрев на проект по умолчанию ASP.NET, я обнаружил, что мне нужно включить это при запуске моего приложения:

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

Мне не хватало пакета: Microsoft.AspNet.WebApi.Owin для ApiControllers. Надеюсь это поможет!

D-Go
источник
1

У меня была такая же проблема, и я решил ее с помощью частного метода: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

У меня это сработало.


источник
0

Мне пришлось добавить пакет Microsoft.AspNet.Identity.Owin

GraehamF
источник