Request.GetOwinContext를 찾을 수 없습니다.


101

왜 이것이 작동하지 않는지 알아 내려고 한 시간 동안 검색했습니다.

WebAPI가있는 ASP.Net MVC 5 응용 프로그램이 있습니다. 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는 인텔리 센스 옵션도 제공하지 않습니다.

내가 여기서 무엇을 놓치고 있습니까?


그것은에서의 System.Web.Http네임 스페이스,하지만 출신 System.Web.Http.OwinDLL. 당신은 그것을 언급 했습니까?
Simon C

좋아, Microsoft.AspNet.WebApi.Owin에 대한 너겟 패키지를 찾아서 설치하고 System.Web.Http 및 System.Web.Http.Owin에 대한 사용을 포함했지만 여전히 작동하지 않습니다.
Scottie 2014 년

2
죄송합니다. 위의 댓글에는 System.Net.Http네임 스페이스 가 있어야 합니다. 당신이에 사용 필요가 없습니다 .Owin, 단지 using System.Net.Http당신이 이미 가지고있다.
Simon C

답변:


163

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

토큰 취소가 너무 어렵습니다 !!! 그러나이 답변은 마침내 작동하도록 도왔습니다 (또한 액세스 권한이있는 db에서 수동으로 삭제). 감사합니다!!
SlimsGhost 2015 년

나도이 문제가 있지만 문제 해결 설치 패키지 Microsoft.Owin.Host.SystemWeb 사용했습니다
hmfarimani

1
이 확장 방법은 WebAPI와는 아무 상관이 없으며, 실제로 그것은에서입니다 - 이것은 정확한 것으로 간주됩니다 왜하지 않는 Microsoft.Owin.Host.SystemWeb, 아니 Microsoft.AspNet.WebApi.Owin.
John

2
@John-API 컨트롤러를 사용하는 경우 Microsoft.AspNet.WebApi.Owin. 일반 MVC 컨트롤러를 사용하는 경우 Microsoft.Owin.Host.SystemWeb. Request목적에 따라 컨트롤러가 다른 확장 메서드 있도록 사용하는 입력 다릅니다.
Simon C

49

이것들 중 어느 것도 나를 위해 일하지 않았습니다. Nuget 패키지를 Identity로 만든 패키지와 비교해야했는데이 Nuget 패키지가 누락되어 추가되었을 때 문제가 해결되었습니다.

Microsoft.Owin.Host.SystemWeb

ASP.NET 요청 파이프 라인을 사용하여 IIS에서 OWIN을 실행하려면이 기능이 필요합니다.


2
IIS에서 실행할 필요가 없습니다.
Trevor de Koekkoek 2014

1
@TrevordeKoekkoek 그렇습니다.하지만 주석을 제대로 읽으면 IIS에서 실행할 라이브러리가 필요하다는 메시지가 표시됩니다 (IIS에서 실행하려면이 라이브러리 없이는 할 수 없습니다)
Obi

1
해당 패키지와 using System.Web이 필요합니다. 성명서.
Murariu Serban 2015-06-22

그것은 나를 위해 문제를 해결했습니다. 감사!
Artorias2718

45

WEB API에서 다음을 사용하여 참조를 얻을 수 있습니다.

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

그것은 Identity 2.0에서 작동합니다


5
-1 자체 호스팅 시나리오에서는 사용할 수없는 System.Web에 대한 종속성이 필요합니다.
Kugel

6
이 모든 시간이 지나도 사람들은 여전히 ​​HttpContext.Current를 사용하고 있습니까? 테스트 할 수 없습니다. 컨텍스트를 삽입해야합니다.
Trevor de Koekkoek 2014

1
만 Nuget 패키지 Microsoft.Owin.Host.SystemWeb이 나를 위해 일한 설치
히말라야 Garg를

21

이렇게하려면 NuGet 패키지를 추가해야 할 수 있습니다 Microsoft.Owin.Host.SystemWeb.

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

7

제 경우에는 추가해야합니다

using Microsoft.AspNet.Identity.Owin;

다음 줄에서 GetOwinContext 및 GetUserManager를 확인합니다.

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


2

이것은 간단한 답을 찾기 위해 영원히 걸렸습니다.하지만 제가 한 일은 시작에서 인스턴스화 된 IOwinContext의 단일 인스턴스의 Get 확장을 사용하는 것이 었습니다. 그래서 다음과 같이 나왔습니다.

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

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

1

GetOwinContext()확장 방법은 GUI 스레드가 아닌 다른 스레드에서 찾을 수 없습니다.

따라서 awaited 함수 내에서이 함수를 호출하지 않도록주의하십시오 .


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 for ApiControllers. 도움이 되었기를 바랍니다!


1

나는 똑같은 문제가 있었고 개인 방법을 사용하여 해결했습니다. private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

이것은 나를 위해 수 영적으로 일했습니다.


1

(이 답변은 질문에 사용 된 태그에 해당하는 ASP.NET Web API에 대한 것입니다. ASP.NET MVC에 대한 문의 인 경우이 질문을 참조하십시오 .)

이 질문은 ASP.NET Web API 서비스를 호스팅 하는 방법을 지정하지 않습니다 . 이 게시물 의 대화는 다음을 나타냅니다.

kichalla 님이 2014 년 10 월 24 일 오전 1:35에 작성했습니다.

자체 호스팅이 아닌 경우 IIS와 함께 Microsoft.AspNet.WebApi.Owin 패키지를 사용하지 마십시오 .이 패키지는 자체 호스팅 에서만 사용해야 합니다.

수락 된 답변Microsoft.AspNet.WebApi.Owin 에서 패키지 사용을 권장합니다 . 이 답변에서는 IIS에서 ASP.NET Web API 서비스를 호스팅 할 때 어떤 효과가 있었는지보고 합니다 .

먼저 다음 NuGet 패키지를 설치합니다.

Microsoft.Owin.Host.SystemWeb

OWIN 기반 응용 프로그램이 ASP.NET 요청 파이프 라인을 사용하여 IIS에서 실행되도록하는 OWIN 서버입니다.

(필자가 작성하는 동안이 NuGet 패키지의 사용 가능한 최신 버전은 3.1.0 입니다. 또한 중요 할 수있는 한 Visual Studio 2013 업데이트 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수업 중입니다.

다시 말하지만, IIS에서 웹 API 서비스를 호스팅하는 사람들에게는 이것이 GetOwinContext2017 년 말에 대한 정의를 찾을 수있는 위치에 대한 모호함 을 없애는 것입니다.


당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.