I have downloaded, and successfully ran the ASP.NET Identity sample from here: https://github.com/rustd/AspnetIdentitySample
I am now in the middle of implementing the ASP.NET Identity framework in my project and have ran into a problem, that has driven me mad all day...
GetOwinContext() does not exist as an extension method on my HttpContext
I am implementing the identity framework in class library. I have installed all the latest (pre-release version) of the Identity framework and everything - apart from this - is working fine.
I have tried implementing the same code as the same direct in my controller, and find the same problem.
I'm clearly missing a reference somewhere, though I have no idea what..!..
The code-block that is killing me is:
private IAuthenticationManager AuthenticationManager
{
get
{
return HttpContext.GetOwinContext().Authentication;
}
}
I have added references to the following - tried these both in my class library and also direct on the controller, none of them work for me...
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
using Microsoft.Owin.Security;
using Microsoft.Owin;
using System.Web;
... this is driving me up the wall....any idea?
UPDATE
I have checked the versions of Identity & OWIN in the sample, and I have made sure I have the same versions in my solution.
More so, if I search the object browser on the sample for GetOwinContext
I can find the method, however when I search for it in my solution it is nowhere to be found... I must have some library out of date, but I can't find it!
ARGH!
I found it... I didn't have an extra package, called Microsoft.Owin.Host.SystemWeb
Once i searched and installed this, it worked.
Now - i am not sure if i just missed everything, though found NO reference to such a library or package when going through various tutorials. It also didn't get installed when i installed all this Identity framework... Not sure if it were just me..
EDIT Although it's in the Microsoft.Owin.Host.SystemWeb
assembly it is an extension method in the System.Web
namespace, so you need to have the reference to the former, and be using
the latter.
I believe you need to reference the current HttpContext
if you are outside of the controller. The MVC controllers have a base reference to the current context. However, outside of that, you have to explicitly declare you want the current HttpContext
return HttpContext.Current.GetOwinContext().Authentication;
As for it not showing up, a new MVC 5 project template using the code you show above (the IAuthenticationManager
) has the following using statements at the top of the account controller:
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;
Commenting out each one, it appears the GetOwinContext()
is actually a part of the System.Web.Mvc assembly.
System.Web.Mvc
from your class project. When commented out, that is what made HttpContext.GetOwinContext()
become unknown (and not the Microsoft.Owin.Security
assembly)
HttpContext
on the Controller
class, so if you inherit from that, HttpContext.GetOwinContext()
works as expected. If you inherit from ApiController
though, there is no such property. Therefore, HttpContext
will refer to the class, which will require you to use Current
to access an instance of the class. So if you copy/paste code from a Controller to an ApiController and wonder why it doesn't work, this is the answer for you.
After trial and error comparing the using statements of my controller and the Asp.Net Template controller
using System.Web;
Solved the problem for me. You are also going to need to add:
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.Owin;
To use GetUserManager method.
Microsoft couldn't find a way to resolve this automatically with right click and resolve like other missing using statements?
In my case adding Microsoft.AspNet.WebApi.Owin reference via nuget did the trick.
Make sure you installed the nuget package Microsoft.AspNet.Identity.Owin
. Then add System.Net.Http
namespace.
Microsoft.Owin.Host.SystemWeb
did the trick though.
Just using
HttpContext.Current.GetOwinContext()
did the trick in my case.
For Devs getting this error in Web API Project -
The GetOwinContext extension method is defined in System.Web.Http.Owin
dll and one more package will be needed i.e. Microsoft.Owin.Host.SystemWeb
. This package needs to be installed in your project from nuget.
Link To Package: OWIN Package Install Command -
Install-Package Microsoft.AspNet.WebApi.Owin
Link To System.web Package : Package Install Command -
Install-Package Microsoft.Owin.Host.SystemWeb
In order to resolve this error you need to find why its occurring in your case. Please Cross check below points in your code -
You must have reference to Microsoft.AspNet.Identity.Owin; using Microsoft.AspNet.Identity.Owin; Define GetOwinContext() Under HttpContext.Current as below - return _userManager1 ?? HttpContext.Current.GetOwinContext().GetUserManager
Complete Code Where GetOwinContext() is used -
public ApplicationSignInManager SignInManager
{
get
{
return _signInManager ?? HttpContext.Current.GetOwinContext().Get<ApplicationSignInManager>();
}
private set
{
_signInManager = value;
}
}
Namespace's I'm Using in Code File where GetOwinContext() Is used
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;
I got this error while moving my code from my one project to another.
To get UserManager in API
return HttpContext.Current.GetOwinContext().GetUserManager<AppUserManager>();
where AppUserManager is the class that inherits from UserManager.
I had all the correct packages and usings, but had to built first before I could get GetOwinContext()
to work.
Just install this package and your code will work:=> Install-Package Microsoft.Owin.Host.SystemWeb -Version 2.1.0
Success story sharing
var authenticationManager = HttpContext.Current.GetOwinContext().Authentication;
(Current included where it wasn't there in the question).