Не вдається знайти Request.GetOwinContext


101

Я протягом години шукав, намагаючись з’ясувати, чому це не працює.

У мене є програма ASP.Net MVC 5 з WebAPI. Я намагаюся отримати Request.GetOwinContext (). Автентифікацію, однак я не можу знайти, як включити 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 також не дає мені жодних варіантів інтелігенції.

Що я тут пропускаю?


Це в 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ви вже є.
Саймон С

Відповіді:


163

Метод GetOwinContextрозширення знаходиться в System.Web.Http.Owindll, який потрібно завантажити як цілий пакунок (назва пакета 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визначення, яке ви маєте, має бути точним.

EDIT

Гаразд, щоб усунути деяку плутанину: Якщо ви використовуєте ApiController (тобто MyController : ApiController), вам знадобиться Microsoft.AspNet.WebApi.Owinпакет.

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

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


Друга посилання працювала на мене. Просто запустіть Install-Package Microsoft.AspNet.WebApi.Owin у своєму менеджері пакетів.
Рогала

Скасування токенів занадто важке !!! Але ця відповідь нарешті допомогла мені змусити його працювати (плюс вручну видалити його з db, до якого я маю доступ). Дякую!!
SlimsGhost

У мене є і ця проблема, але я вирішив проблему
hmfarimani

1
Я не розумію, чому це вважається правильним - цей метод розширення не має нічого спільного з WebAPI, і справді він є Microsoft.Owin.Host.SystemWeb, ні Microsoft.AspNet.WebApi.Owin.
Джон

2
@John - Якщо ви використовуєте контролер API, який вам потрібен Microsoft.AspNet.WebApi.Owin. Якщо ви перебуваєте у звичайному контролері MVC, вам знадобиться Microsoft.Owin.Host.SystemWeb. RequestОб'єкт відрізняється в залежності від того, якого типу контролера ви використовуєте так інший метод розширення.
Саймон С

49

Жодне з них не працювало на мене. Мені довелося порівняти пакунки Nuget з тим, який було створено за допомогою Identity, і я виявив, що цей пакунок Nuget відсутній, який при додаванні вирішив проблему для мене

Microsoft.Owin.Host.SystemWeb

Мабуть, вам це потрібно для запуску OWIN на IIS за допомогою конвеєра запиту ASP.NET (читайте, що ви без цього накручені!)


2
не потрібно бігати на IIS.
Тревор де Коеккьок

1
@TrevordeKoekkoek так, але якщо ви прочитали коментар належним чином, він говорить про те, що вам потрібна бібліотека для роботи на IIS (Якщо ви хочете працювати на IIS, ви не можете обійтися без цієї бібліотеки)
Obi

1
вам потрібен цей пакет плюс використовуваний System.Web; заява.
Мураріу Сербан

Це вирішило для мене питання. Дякую!
Artorias2718

45

В WEB API ви можете отримати посилання за допомогою наступного:

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

він працює в Identity 2.0


5
-1 Для цього потрібна залежність від System.Web, яка недоступна в самостійних сценаріях.
Кугель

6
Після закінчення цього часу люди все ще використовують HttpContext.Current? Це не перевіряється. контекст слід вводити.
Тревор де Коеккьок

1
Для мене працювала лише установка Nuget Package 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 Console App
Serexx

2

Це зайняло мене назавжди, щоб знайти просту відповідь: але те, що я зробив, було використовувати розширення Get для єдиного екземпляра IOwinContext, яке було створено при запуску. Так вийшло так:

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

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

1

Метод GetOwinContext()розширення не знайдено в потоках, відмінних від потоку GUI.

Тому будьте обережні, щоб не викликати цю функцію з будь-якої awaitфункції редагування.


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. Сподіваюся, це допомагає!


1

У мене була ця сама проблема і вирішено її за допомогою приватного методу: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

Це працювало плавно для мене.


1

(Будь ласка, зауважте, що ця відповідь призначена для веб-API ASP.NET, який відповідає тегу, який використовується у цьому питанні. Дивіться це питання, якщо ваш запит стосується ASP.NET MVC.)

Питання не визначає, як розмістити послугу веб-API ASP.NET . Діалогове вікно в цій публікації вказує (моє наголос):

kichalla написав 24 жовтня 2014 р. о 1:35 ранку

Якщо ви НЕ є самостійним хостингом, не використовуйте пакет Microsoft.AspNet.WebApi.Owin з IIS ... цей пакет повинен використовуватися лише для самостійного хостингу .

Використання Microsoft.AspNet.WebApi.Owinпакета рекомендується у прийнятій відповіді . У цій відповіді я повідомляю, що працювало на мене під час розміщення послуги ASP.NET Web API в 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уроці.

Знову ж таки, для тих, хто розміщує свою службу Web API в IIS, я сподіваюся, що це усуне будь-яку неоднозначність щодо того, де GetOwinContextможна знайти визначення щодо цієї пізньої дати 2017 року.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.