Ідентичність ASP.NET - HttpContext не має методу розширення для GetOwinContext


384

Я завантажив і успішно запустив зразок ідентичності ASP.NET звідси: https://github.com/rustd/AspnetIdentitySample

Я зараз в середині впровадження системи ASP.NET Identity у своєму проекті і зіткнувся з проблемою, яка зводила мене з розуму цілий день ...

GetOwinContext() не існує як метод розширення на моєму HttpContext

Я впроваджую систему ідентичності в бібліотеці класів. Я встановив всю останню (попередню версію) рамки Identity, і все - крім цього - працює нормально.

Я спробував реалізувати той самий код, що і той самий прямий у своєму контролері, і знайшов ту саму проблему.

Мені явно десь не вистачає посилання, хоча я поняття не маю, що ..! ..

Блок коду, який мене вбиває:

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

Я додав посилання на наступне - спробував їх як у моїй бібліотеці класів, так і безпосередньо на контролері, жоден з них не працює для мене ...

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

... це підводить мене до стіни .... будь-яка ідея?

ОНОВЛЕННЯ

Я перевірив версії Identity & OWIN у зразку, і переконався, що в моєму рішенні є ті самі версії.

Більше того, якщо я шукаю об’єктний браузер за зразком, GetOwinContextя можу знайти метод, проте коли я шукаю його у своєму рішенні, його ніде не знайти ... У мене повинна бути застаріла бібліотека, але я можу ' не знайдеш!

Відповіді:


712

ARGH!

Я знайшов це ... У мене не було додаткового пакету, зателефонувалиMicrosoft.Owin.Host.SystemWeb

Як тільки я це шукав і встановив, він працював.

Тепер - я не впевнений, чи просто я все пропустив, хоча не знайшов жодної посилання на таку бібліотеку чи пакет, коли проходив різні навчальні посібники. Він також не був встановлений, коли я встановив усі ці рамки ідентичності ... Не впевнений, чи це був лише я.

EDIT Хоча це в Microsoft.Owin.Host.SystemWebзборі, це метод розширення в System.Webпросторі імен, тому вам потрібно мати посилання на перший і бути usingдругим.


6
Дякуємо, що зрозуміли це : я використовую цей підручник asp.net/identity/overview/getting-started/…, і це крок, що пропав
френч

23
@tne - дякую за ваш коментар ... хоча я навряд чи "безцільно бігав" - я слідкував за підручником із надійного ресурсу; з сайту asp.net не менше. У них не було цього кроку у своєму підручнику (він з тих пір був доданий) - також факт, що люди підтримують і цю відповідь, і оригінальний Q також вказує на те, що я не був єдиним із цим питанням.
Даррен Уейнрайт

5
@Darren, досить справедливо. (Я розумію , що я міг би сформулювати це по- іншому.)
Tne


5
Не знаю, чи було це від оновлення цього посилання, але я повинен був трохи змінити своє завдання на var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;(Поточний включений там, де його не було в питанні).
Ортунд

177

Я вважаю, що вам потрібно HttpContextвіднести струм, якщо ви знаходитесь поза контролером. Контролери MVC мають базове посилання на поточний контекст. Однак поза цим ви повинні чітко заявити, що хочете струмуHttpContext

return HttpContext.Current.GetOwinContext().Authentication;

Що стосується того, що він не відображається, новий шаблон проекту MVC 5, що використовує код, показаний вище (the IAuthenticationManager), має наступні дані, використовуючи виписки вгорі контролера облікового запису:

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;

Коментуючи кожну з них, видається, що вона GetOwinContext()є фактично частиною збірки System.Web.Mvc.


Спробували це і просто не змогли його знайти. - я маю на увазі GetOwinContext ().
Даррен Уейнрайт

2
@Darren - Я трохи пограв із зразком шаблону і, можливо, у вас є збірка, якої ви не вистачаєте. Схоже, вам потрібно буде посилатися System.Web.Mvcна проект вашого класу. Коли це прокоментували, саме це HttpContext.GetOwinContext()стало невідомим (а не Microsoft.Owin.Securityзбіркою)
Tommy

Я намагаюся, щоб це теж працювало безпосередньо на контролері - і знову не можу його знайти.
Даррен Уейнрайт

19
Це мене спонукало. Існує суспільна властивість HttpContextна Controllerкласі, так що якщо ви успадкували від того, HttpContext.GetOwinContext()працює , як очікувалося. Якщо ви успадковуєте від цього ApiController, то такого майна немає. Отже, HttpContextбуде посилатися на клас, який вимагатиме від вас використання Currentдоступу до екземпляра класу. Отже, якщо ви копіюєте / вставляєте код з контролера в ApiController і дивитесь, чому він не працює, це відповідь для вас.
Девід Міані

"Поточний" був для мене ґаздом
натисніть Ок

24

Після проб і помилок порівнюючи використовувані висловлювання мого контролера та контролера шаблонів Asp.Net

using System.Web;

Вирішили проблему для мене. Вам також потрібно буде додати:

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

Для використання методу GetUserManager.

Microsoft не змогла знайти спосіб вирішити це автоматично за допомогою клацання правою кнопкою миші та усунення, як і інших відсутніх з використанням операторів?


1
Це працювало і для мене. У мене вже були бібліотеки Identity, але, здається, потрібен System.Web.
SouthShoreAK

1
Це, мабуть, багато рухається, як на зборах, так і в просторах імен. Це робить дуже болісно, ​​оскільки це метод подовження. Я оновив усі мої бібліотеки, і ця відповідь відображає, де вона зараз знаходиться.
Шеннон

ах, ви будете мати пекло в новій формі
JustJohn

1
Так, на жаль, методи розширення неможливо вирішити автоматично.
Ronen Festinger

22

У моєму випадку додавання посилання Microsoft.AspNet.WebApi.Owin через nuget зробило свою справу .


Так, це зробили для мене в останній останній версії. Метод розширення в цьому пакеті, який Assemby System.Web.Http.Owin і в простір імен System.Net.Http
oatsoda

16

Переконайтеся, що ви встановили пакет nuget Microsoft.AspNet.Identity.Owin. Потім додайте System.Net.Httpпростір імен.


У мене теж був такий. Виявляється, була встановлена ​​ще одна бібліотека, яку НЕ встановлювали, коли було встановлено речі Identity.
Даррен Уейнрайт

@Darren Будь ласка, додайте назву пакета. Дякую
Saturn Technologies

6
@SaturnTechnologies Для мене іншим пакетом був Microsoft.Owin.Host.SystemWeb та простір імен System.Web
WiSeeker

1
Я другий WiSeeker. Для мене це не допомогло. Пропозиція Даррена про встановлення Microsoft.Owin.Host.SystemWebзробила трюк.
Макс Барраклу

13

Просто за допомогою

HttpContext.Current.GetOwinContext ()

зробив трюк у моєму випадку.


10

Для розробників, які отримують цю помилку в проекті Web API -

Метод розширення GetOwinContext визначений у System.Web.Http.Owindll і потрібен ще один пакет, тобто Microsoft.Owin.Host.SystemWeb. Цей пакет повинен бути встановлений у вашому проекті з nuget.

Посилання на пакет : команда встановлення пакету OWIN -

Install-Package Microsoft.AspNet.WebApi.Owin    

Посилання на пакет System.web : Команда встановлення пакета -

Install-Package Microsoft.Owin.Host.SystemWeb

Для усунення цієї помилки вам потрібно знайти, чому вона виникає у вашому випадку. Перевірте пункт нижче у вашому коді -

  1. Ви повинні мати посилання на Microsoft.AspNet.Identity.Owin;

    за допомогою Microsoft.AspNet.Identity.Owin;

  2. Визначити GetOwinContext()під, HttpContext.Currentяк нижче -

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

    АБО

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

Повний код, де використовується GetOwinContext () -

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

Простір імен я використовую у файлі коду, де використовується GetOwinContext ()

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;

Я отримав цю помилку під час переміщення коду з мого одного проекту на інший.


4

Щоб отримати UserManager в API

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

де AppUserManager - клас, який успадковується від UserManager.


4

У мене були всі правильні пакети та пристосування, але довелося будувати спочатку, перш ніж я міг приступити GetOwinContext()до роботи.


Як ви виправили свою збірку, щоб вона працювала вперше?
Нордес

@Nordes Іноді VS не спрацьовує збірку у фоновому режимі (тобто: він повідомляє вам про помилки компіляції), але запускаючи реальну збірку (або частіше очищати, а потім збирати), вона отримає це через. Це, мабуть, те, що переживав Кевін.
Маверик

0

Просто встановіть цей пакет і ваш код буде працювати: => Встановити-пакет Microsoft.Owin.Host.SystemWeb -Version 2.1.0

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