asp.net-mvc – ASP.NET MVC App中基于声明的条件编辑操作授权设
发布时间:2020-12-16 00:00:36 所属栏目:asp.Net 来源:网络整理
导读:使用基于声明的模型设计ASP.Net MVC应用程序授权.让我们说我们有一个名为 – Product的对象.通常,有4种不同的操作 – 创建,编辑,删除和查看.授权使用ClaimsAuthorize属性完成. [Authorize]public class ProductController : Controller{ [ClaimsAuthorize("P
使用基于声明的模型设计ASP.Net MVC应用程序授权.让我们说我们有一个名为 – Product的对象.通常,有4种不同的操作 – 创建,编辑,删除和查看.授权使用ClaimsAuthorize属性完成.
[Authorize] public class ProductController : Controller { [ClaimsAuthorize("Product","VIEW")] public List<Product> GetProducts() { // .... } [ClaimsAuthorize("Product","CREATE")] public Product CreateNewProduct(Product product) { //.... } } 但就我而言,我必须支持不同类型的EDIT权限: >如果同一用户最初创建了产品,则某些用户可以编辑产品 如何优雅地授权所有这些Edit操作(最好是如上所示的属性驱动),同时我希望将授权代码与普通的MVC控制器代码和业务逻辑分开. [上面的代码示例在语法上不正确,我只是为了解释这个问题而编写的] 解决方法
对于你的问题的第一部分,基于声明的授权,我已经在
this similar question回答了它.我不打算在此重复.
但是对于您的另一个规则,例如只有所有者可编辑的产品.您可以为每个规则编写单独的AuthorizeAttribute并将其应用于您的操作,将此视为一个简单示例: using Microsoft.AspNet.Identity; public class OwnerAuthorizeAttribute : AuthorizeAttribute { private string _keyName; public bool IsPost { get; set; } public OwnerAuthorizeAttribute(string keyName) { _keyName = keyName; } protected override bool AuthorizeCore(HttpContextBase httpContext) { // imagine you have a service which could check owner of // product based on userID and ProductID return httpContext.User.Identity.IsAuthenticated && this.ContainsKey && _productService.IsOwner(httpContext.User.Identity.GetUserId(),int.Parse(this.KeyValue.ToString())); } private bool ContainsKey { get { return IsPost ? HttpContext.Current.Request.Form.AllKeys.Contains(_keyName) // for simplicity I just check route data // in real world you might need to check query string too : ((MvcHandler)HttpContext.Current.Handler).RequestContext .RouteData.Values.ContainsKey(_keyName); } } private object KeyValue { get { return IsPost ? HttpContext.Current.Request.Form[_keyName] // for simplicity I just check route data // in real world you might need to check query string too : ((MvcHandler)HttpContext.Current.Handler) .RequestContext.RouteData.Values[_keyName]; } } } 您也可以对其他规则重复相同的模式. 您只需将自定义属性应用于您的操作: [OwnerAuthorize("id")] public ActionResult Edit(int id) { // your code } [HttpPost] // double checking in post back too [OwnerAuthorize("id",IsPost = true)] public ActionResult Edit(Product product) { // your code } 很明显,您可以将多个AuthorizeAttribute应用于您的操作.在这种情况下,所有这些都必须返回true. [ClaimsAuthorize("Product","EDIT")] [OwnerAuthorize("id")] [YetOtherAuthorize] public ActionResult MyFancyAction(int id) { } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- Owin错误与ASP.NET MVC应用程序
- asp.net – 如何将ApplicationDbContext从Owin管道中取出
- Asp.Net Core 2.0 生成操作数据库文件需要的文件
- 如何将asp.net文本框滚动到底部
- asp.net-mvc-3 – MVC按钮点击动作
- asp.net-mvc – 从扩展Apicontroller的MVC控制器返回Json
- asp.net-mvc – 为什么LINQ to Entities不能识别方法’Syst
- asp.net-mvc – 在Azure中预编译ASP.NET MVC项目(不与Web部
- 构建发布版混合ASP.Net和.Net Standard 2.0项目的SGEN错误解
- asp.net-mvc-3 – 分页/排序不适用于部分视图中使用的网格
推荐文章
站长推荐
- asp.net-mvc – 如何锁定一个asp.net mvc动作?
- asp.net-mvc – 在.NET MVC 3中使用REST Web服务
- asp.net – 回滚请求身体流
- asp.net – 谷歌Chrome在崩溃后恢复会话cookie,如
- asp.net-mvc – 绑定排除Asp.net MVC不适用于LIN
- 在Entity Framework中使用存储过程(二):具有继
- .NET Core技术研究-主机Host ASP.NET
- asp.net – 是否可以在多个Web服务器之间共享Sys
- asp.net-mvc – ASP.NET MVC ViewModel方法 – 是
- asp.net-mvc – 如何在向Db插入数据时自动生成as
热点阅读