In our asp.net mvc/web api project, we want to customize the authorization using AuthorizeAttribute
. We have noticed that there are two different AuthorizeAttribute
, one in System.Web.MVC
namespace for MVC and the other in System.Net.Http
namespace for web api.
It works in MVC, our code like this:
public class MyPrincipal : IPrincipal
{
//some custom properties
public bool IsValid()
{
//custom authentication logic
}
private IIdentity identity;
public IIdentity Identity
{
get { return this.identity; }
}
public bool IsInRole(string role)
{
return true;
}
}
//override AuthorizeCore
public class MyAuthorizeAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
MyPrincipal user = new MyPrincipal();
if (user.isValid())
{
httpContext.User = user;
}
else
{
httpContext.Response.Redirect("~/Common/NoAuthorize", true);
}
}
}
[MyAuthorizeAttribute]
public class BaseMyController : Controller
{
protected virtual new MyPrincipal User
{
get { return HttpContext.User as MyPrincipal; }
}
}
Then in MVC controller,we can get the user information via MyPrincipal
user property.
However, when we start to use the same way in web api, we found that the web api has no HttpContext
property and in System.Web.Http.AuthorizeAttribute
, the method to be override accepts a HttpActionContext
argument, it also has no HttpContext
property or some where else we can set the MyPrincipal
instance.
I notice that the System.Web.Http.AuthorizeAttribute
summary says
Specifies the authorization filter that verifies the request's IPrincipal
It seems that there is some other way to set the IPrincipal
instance.
I have no idea about it, any good advice? By the way, why does the asp.net web api controller have no HttpContext
? Is there any design pattern about it?
The related questions ASP.NET MVC - Set custom IIdentity or IPrincipal