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

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

У меня есть приложение 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 не дает мне никаких вариантов intellisense.

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

Ответ 1

Метод расширения GetOwinContext находится в System.Web.Http.Owin dll, который должен быть загружен как пакет 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 (i.e MyController : ApiController), вам понадобится пакет Microsoft.AspNet.WebApi.Owin.

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

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

Ответ 2

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

Microsoft.Owin.Host.SystemWeb

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

using Microsoft.AspNet.Identity.Owin;

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

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

Ответ 8

Метод расширения GetOwinContext() не найден в потоках, отличных от потока GUI.

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

Ответ 9

После просмотра проекта по умолчанию 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);`

Ответ 10

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

Ответ 11

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

Это работало плавно для меня.