Xin*_*ng 7 asp.net-mvc asp.net-web-api
在我们的asp.net mvc/web api项目中,我们希望使用自定义授权AuthorizeAttribute.我们注意到有两种不同的AuthorizeAttribute,一种是System.Web.MVC用于MVC的System.Net.Http命名空间,另一种是用于web api的命名空间.
它适用于MVC,我们的代码如下:
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
然后在MVC控制器中,我们可以通过MyPrincipal用户属性获取用户信息.
但是,当我们开始在web api中使用相同的方式时,我们发现web api没有HttpContext属性,而且System.Web.Http.AuthorizeAttribute,要覆盖的方法接受一个HttpActionContext参数,它也没有HttpContext属性或者我们可以设置MyPrincipal实例的其他地方.
我注意到System.Web.Http.AuthorizeAttribute摘要说
指定验证请求的IPrincipal的授权过滤器
似乎还有其他一些方法来设置IPrincipal实例.
我不知道,有什么好建议吗?那么,为什么asp.net web api控制器没有HttpContext?有关于它的设计模式吗?
我主要在以下方面实现了一些概念验证:ASP.NET Web API 2中的身份验证筛选器
对于Web API,您可以创建一个属性IAuthenticationFilter。如果我没记错的话,可以将其作为过滤器添加到WebApiConfig中的全局过滤器中
config.Filters.Add(new YourAuthenticationAttribute());
Run Code Online (Sandbox Code Playgroud)
或者,您可以将其用作api控制器/方法上的属性。
然后,您可以实现AuthenticateAsync,获取请求的授权标头,检查方案并验证参数,如果所有参数均有效,则设置主体。
我认为,您可以在一个链中添加多个这些过滤器,并且它们都可以针对一组特定的需求进行身份验证,例如他们要寻找的方案,并在链中某个地方设置了主体,或者返回了挑战。
public class YourAuthenticationAttribute : Attribute, IAuthenticationFilter
{
public Task AuthenticateAsync(HttpAuthenticationContext context, CancellationToken cancellationToken)
{
HttpRequestMessage request = context.Request;
if (request.Headers.Authorization != null &&
request.Headers.Authorization.Scheme.Equals("yourScheme", StringComparison.OrdinalIgnoreCase))
{
// get the value sent with the header.
string authParam = request.Headers.Authorization.Parameter;
// do some validation on the parameter provided...
// if it's all valid, create a principal with claims:
List<Claim> claims = new List<Claim>()
{
new Claim(ClaimTypes.Name, "Eddie Admin"),
new Claim(ClaimTypes.Role, "Admin"),
// new Claim(ClaimTypes.Role, "Delete"),
};
// create an identity with the valid claims.
ClaimsIdentity identity = new ClaimsIdentity(claims, "yourScheme");
// set the context principal.
context.Principal = new ClaimsPrincipal(new[] { identity });
Run Code Online (Sandbox Code Playgroud)
创建主体时,您可以申请索赔,并根据常规授权属性检查索赔。例如
[Authorize(Roles = "Admin")]
Run Code Online (Sandbox Code Playgroud)
除了执行此操作外,我还没有使用它,但是希望这可以为您指明正确的方向。
| 归档时间: |
|
| 查看次数: |
14140 次 |
| 最近记录: |