找不到Request.GetOwinContext

时间:2014-03-23 23:33:31

标签: c# asp.net-web-api owin

我一直在寻找一小时试图弄清楚为什么这不起作用。

我有一个带有WebAPI的ASP.Net MVC 5应用程序。我正在尝试获取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选项。

我在这里缺少什么?

13 个答案:

答案 0 :(得分:146)

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(即MyController : ApiController),则需要Microsoft.AspNet.WebApi.Owin包。

如果您使用常规Mvc控制器(即MyController : Controller),则需要Microsoft.Owin.Host.SystemWeb包。

在MVC 5中,Api和常规MVC的管道非常不同,但通常具有相同的命名约定。因此,一个扩展方法不适用于另一个。对于许多动作过滤器等​​也是如此。

答案 1 :(得分:47)

这些都不适合我。我不得不将Nuget软件包与使用Identity创建的软件包进行比较,我发现这个Nuget软件包丢失了,当我添加时修复了我的问题

Microsoft.Owin.Host.SystemWeb

显然你需要它使用ASP.NET请求管道在IIS上运行OWIN(如果没有它,请阅读你!)

答案 2 :(得分:42)

在WEB API中,您可以使用以下内容获取参考:

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

它适用于Identity 2.0

答案 3 :(得分:20)

您可能需要添加NuGet包Microsoft.Owin.Host.SystemWeb才能执行此操作:

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

答案 4 :(得分:7)

在我的情况下,我需要添加

using Microsoft.AspNet.Identity.Owin;

用于解析GetOwinContext,然后在下一行解析GetUserManager。

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

答案 5 :(得分:4)

I have this problem and I download extra package from nuget to solve my problem,(run following command in Package Manager Console) Install-Package Microsoft.Owin.Host.SystemWeb

答案 6 :(得分:2)

这让我永远找到了一个简单的答案:但我所做的是使用在启动时实例化的IOwinContext的单个实例的Get扩展。所以它出现了这样:

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

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

答案 7 :(得分:1)

在GUI线程以外的线程中找不到GetOwinContext()扩展方法。

因此请注意不要在任何await ed函数中调用此函数。

答案 8 :(得分: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);`

答案 9 :(得分:1)

我缺少包:ApiControllers的Microsoft.AspNet.WebApi.Owin。 希望这有帮助!

答案 10 :(得分:1)

我遇到了同样的问题并使用私有方法解决了这个问题: private IAuthenticationManager AuthenticationManager { get { return HttpContext.Current.GetOwinContext().Authentication; } }

这对我来说很有效。

答案 11 :(得分:1)

(请注意,这个答案适用于ASP.NET Web API,它对应于问题中使用的标记。如果您的查询是关于ASP.NET MVC,请参阅this question。)

该问题未指定ASP.NET Web API服务如何hostedthis post中的对话框表示(强调我的):

  

kichalla于2014年10月24日上午1:35写道

     

如果您不是自托管,请不要使用 Microsoft.AspNet.WebApi.Owin   与IIS打包...这个包只能与 self一起使用   托管

accepted answer建议使用Microsoft.AspNet.WebApi.Owin包。在这个答案中,我报告了当在IIS中托管ASP.NET Web API服务时对我有用的东西。

首先,安装以下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并选择&#34; Peek Definition,&#34; 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中托管其Web API服务的人,我希望这清除了关于2017年这个晚期可以找到GetOwinContext的定义的任何含糊不清。

答案 12 :(得分:0)

我必须添加包Microsoft.AspNet.Identity.Owin