如何自定义ASP.NET Web API AuthorizeAttribute的异常要求
我继承自System.Web.Http.AuthorizeAttribute以创建一个自定义的授权/身份验证例程,以满足使用ASP.NET MVC 4开发的Web应用程序的一些不寻常的要求。这增加了Web API用于从Web的Ajax调用的安全性客户。要求是:
>用户必须在每次执行事务时登录才能验证 Web客户端是一个single page application (SPA),所以典型的表单身份验证不工作这么好,但我试图重用尽可能多的ASP.NET安全框架,我可以满足要求。自定义的AuthorizeAttribute非常适合需求2确定与Web服务方法相关联的角色。我接受三个参数,应用程序名称,资源名称和操作,以确定与方法相关联的角色。 public class DoThisController : ApiController { [Authorize(Application = "MyApp",Resource = "DoThis",Operation = "read")] public string GetData() { return "We did this."; } } 我覆盖OnAuthorization方法以获取角色并验证用户。由于用户必须针对每个事务进行认证,所以通过在同一步骤中执行认证和授权来减少来回抖动。我通过使用传递HTTP标头中的加密凭证的基本身份验证从Web客户端获取用户凭据。所以我的OnAuthorization方法看起来像这样: public override void OnAuthorization(HttpActionContext actionContext) { string username; string password; if (GetUserNameAndPassword(actionContext,out username,out password)) { if (Membership.ValidateUser(username,password)) { FormsAuthentication.SetAuthCookie(username,false); base.Roles = GetResourceOperationRoles(); } else { FormsAuthentication.SignOut(); base.Roles = ""; } } else { FormsAuthentication.SignOut(); base.Roles = ""; } base.OnAuthorization(actionContext); } GetUserNameAndPassword从HTTP头中检索凭据。然后我使用Membership.ValidateUser验证凭据。我有一个自定义成员资格提供程序和角色提供程序插入到一个自定义数据库。如果用户被验证,我然后检索资源和操作的角色。从那里,我使用基本OnAuthorization完成授权过程。这里是它分解的地方。 如果用户被验证,我使用标准表单验证方法在(FormsAuthentication.SetAuthCookie)中记录用户,如果他们失败,我注销它们(FormsAuthentication.SignOut)。但是问题似乎是基于OnAuthorization类没有访问Principal,它被更新,以便IsAuthenticated设置为正确的值。它总是一步之后。我的猜测是,它使用一些缓存的值,不会更新,直到有一个往返的Web客户端。 所以所有这一切导致我的具体问题是,有没有另一种方法设置IsAuthenticated正确的值为当前Principal而不使用Cookie?在我看来,cookie并不真正适用于这种特定的场景,我必须每次验证。我知道IsAuthenticated的原因没有设置为正确的值是我也重写HandleUnauthorizedRequest方法到这: protected override void HandleUnauthorizedRequest(HttpActionContext filterContext) { if (((System.Web.HttpContext.Current.User).Identity).IsAuthenticated) { filterContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden); } else { base.HandleUnauthorizedRequest(filterContext); } } 这允许我返回Forbidden的状态代码到Web客户端,如果失败是由于授权而不是认证,它可以相应地做出响应。 那么在这种情况下,为当前原则设置IsAuthenticated的正确方法是什么? 解决方法
我的场景的最佳解决方案似乎是完全绕过基本的OnAuthorization。因为我必须认证每次cookie和缓存的原理都没有太多用处。所以这里是我想出的解决方案:
public override void OnAuthorization(HttpActionContext actionContext) { string username; string password; if (GetUserNameAndPassword(actionContext,password)) { if (!isUserAuthorized(username)) actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Forbidden); } else { actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.Unauthorized); } } else { actionContext.Response = new HttpResponseMessage(System.Net.HttpStatusCode.BadRequest); } } 我开发了自己的方法来验证角色名为isUserAuthorized,我不再使用基本的OnAuthorization,因为它检查当前的原理,看看它是否为认证。 IsAuthenticated只允许获取所以我不知道如何设置它,我似乎不需要当前的原则。测试这个,它工作正常。 仍然有兴趣,如果任何人有一个更好的解决方案,或可以看到任何问题与这一个。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc – 如何在ASP.NET MVC的所有操作中安装动作过滤
- asp.net – 返回状态代码4xx,用于具有无效/不支持的Content
- asp.net-mvc – IIS站点上的高CPU
- asp.net – 为customvalidator设置errormessage?
- asp.net – Devexpress网格延迟加载
- 如何在.NET中使用TreeView控件创建三态复选框?
- 如何通过Remoting实现双向通信
- asp.net-mvc – 无法在MVC 2 RC区域中设置默认控制器
- asp.net – 在代码后面和SqlDataSource中编写查询
- asp.net-membership – MiniProfiler和SqlMembershipProvid
- asp.net-mvc-4 – Azure – Bitbucket部署失败
- asp.net-mvc – 服务层或存储库中的密码哈希等?
- 如何在ASP.NET WebService调用中动态初始化文化?
- entity-framework-core – 实体框架Core 2.0许多
- asp.net – Windows Azure – NetworkInformatio
- asp.net – 在框架4.5下添加新的Web服务
- asp.net-mvc – ASP MVC查看内容为JSON
- 在Docker上部署自动更新ssl证书的nginx + .NET C
- asp.net-mvc – MVC 3依赖解析器或Ninject MVC插
- asp.net signalR 专题—— 第四篇 模拟RPC模式的