天道酬勤,学无止境

MVC 动态页面权限使用授权属性?(MVC Dynamic Page Permissions Using Authorize Attribute?)

问题

我正在为我公司的站点设置我的用户权限,我们必须创建几个不同的角色和权限。 我发现了一些关于创建实际角色和组的很棒的信息,以及如何从这里实现它们。 但是,这仍然需要将角色硬编码到授权标签中,有没有办法动态填充授权标签,以便我可以在网站上有一个页面,我可以快速为不同的页面分配不同的权限,而无需必须返回代码并修改我创建的每个页面的权限集?

回答1

实现以下自定义授权属性。

public class CustomAuthorizeAttribute : AuthorizeAttribute
    {
        public CustomAuthorizeAttribute (params string[] roleKeys) 
        {
            var roles = new List<string>();
            var allRoles = (NameValueCollection)ConfigurationManager.GetSection("CustomRoles");
            foreach(var roleKey in roleKeys) {
                roles.AddRange(allRoles[roleKey].Split(new []{','}));
            }

            Roles = string.Join(",", roles);
        }

        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);
            if (filterContext.Result is HttpUnauthorizedResult)
            {
                filterContext.Result = new RedirectResult("~/Error/AcessDenied");
            }
        }
    }

然后将以下内容添加到 web.config

<section name="CustomRoles" type="System.Configuration.NameValueFileSectionHandler,System, Version=1.0.3300.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" />

然后,作为一个例子

 <CustomRoles>
    <add key="UsersPagePermission" value="HR,Accounts,Developers" /> 
  </CustomRoles>

在您的控制器或操作或全局过滤器中(无论您喜欢哪个:))添加属性

例如

[CustomAuthorize("UsersPagePermission")]
public class UserController : Controller

这将允许您修改 web.config 而不是代码来更改权限。

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何在ASP.NET MVC 4中获取控制器动作的自定义注释属性?(How to get custom annotation attributes for a controller action in ASP.NET MVC 4?)
    问题 我正在为ASP.NET MVC中的应用程序使用基于权限的授权系统。 为此,我创建了一个自定义授权属性 public class MyAuthorizationAttribute : AuthorizeAttribute { string Roles {get; set;} string Permission {get; set;} } 这样我就可以通过角色或特定的权限密钥(带有注解)授权用户,例如 public class UserController : Controller { [MyAuthorization(Roles="ADMIN", Permissions="USER_ADD")] public ActionResult Add() [MyAuthorization(Roles="ADMIN", Permissions="USER_EDIT")] public ActionResult Edit() [MyAuthorization(Roles="ADMIN", Permissions="USER_DELETE")] public ActionResult Delete() } 然后我用类似的逻辑(伪代码)覆盖MyAuthorizationAttribute类中的AuthorizeCore()方法 protected override bool
  • 如何在ASP.NET MVC中重定向到动态登录URL(How to redirect to a dynamic login URL in ASP.NET MVC)
    问题 我正在创建一个多租户网站,该网站托管着客户的页面。 URL的第一段将是一个标识客户端的字符串,该字符串使用以下URL路由方案在Global.asax中定义: "{client}/{controller}/{action}/{id}" 使用/ foo / Home / Index之类的URL可以正常工作。 但是,当使用[Authorize]属性时,我想重定向到也使用相同映射方案的登录页面。 因此,如果客户端是foo,则登录页面将是/ foo / Account / Login,而不是web.config中定义的固定的/ Account / Login重定向。 MVC使用HttpUnauthorizedResult返回401未授权状态,我认为这会导致ASP.NET重定向到web.config中定义的页面。 那么,有谁知道如何重写ASP.NET登录重定向行为? 还是通过创建自定义授权属性在MVC中进行重定向会更好? 编辑-答案:在深入研究.Net源代码之后,我决定自定义身份验证属性是最佳解决方案: public class ClientAuthorizeAttribute: AuthorizeAttribute { public override void OnAuthorization( AuthorizationContext filterContext ) { base
  • 根据当前用户的“角色”动态构建ASP.NET MVC主页页面菜单(Building an ASP.NET MVC Master Page Menu Dynamically, Based on the current User's “Role”)
    问题 我见过类似的问题,但没有一个看起来像我要尝试做的那样。 这是我当前的实现,没有任何安全性: <div id="menucontainer"> <ul id="menu"> <li><%= Html.ActionLink("Main List", "Index", "AController")%></li> <li><%= Html.ActionLink("Product List", "Index", "BController")%></li> <li><%= Html.ActionLink("Company List", "Index", "CController")%></li> <li><%= Html.ActionLink("User List", "Index", "DController")%></li> </ul> </div> 很好,以上方法都可以。 我在CController和DController的Actions上设置了[Authorize]属性,以防止未经授权的访问-但我想从菜单中删除那些没有正确角色的用户的项目,因为当他们看到并单击时,它告诉他们他们没有权限,他们会想要它。 如果他们不知道它在那里,那对于每个参与其中的人来说都会更好…… 这样的事情最终是我想要达到的目标,但是我正在寻找更“ MVC风味”的方式,其中“视图”是“愚蠢的”: <div id
  • ASP.NET MVC中基于角色的访问控制(RBAC)与基于声明的访问控制(CBAC)(Role-based access control (RBAC) vs. Claims-based access control (CBAC) in ASP.NET MVC)
    问题 使用CBAC与RBAC的主要好处是什么? 什么时候使用CBAC更好,什么时候使用RBAC更好? 我正在尝试了解CBAC模型的一般概念,但是对于我来说,一般概念仍然不清楚。 回答1 我将尝试展示如何在ASP.NET MVC上下文中从基于声明的访问控制中受益。 使用基于角色的身份验证时,如果您有创建客户的操作,并且希望具有“销售”角色的人员能够执行此操作,则可以编写如下代码: [Authorize(Roles="Sale")] public ActionResult CreateCustomer() { return View(); } 后来,您意识到有时候,具有“营销”角色的人应该能够创建客户。 然后,您像这样更新您的Action方法 [Authorize(Roles = "Sale", "Marketing")] public ActionResult CreateCustomer() { return View(); } 现在,您意识到,某些市场营销人员不一定能够创建客户,但是不可能为市场营销人员分配其他角色。 因此,您被迫允许所有营销人员创建客户。 您发现了另一个问题,只要您决定允许营销人员创建客户,就必须更新所有MVC动作方法的Authorize属性,编译应用程序,测试和部署。 几天后,您决定不执行市场营销,但应该允许其他角色来执行此任务,因此您在代码库中进行搜索
  • ASP MVC C#:是否可以将动态值传递给属性?(ASP MVC C#: Is it possible to pass dynamic values into an attribute?)
    问题 好吧,我对 C# 很陌生,我正在尝试使用 ASP MVC2 创建一个小网站。 我想创建自己的授权属性。 但是如果可能的话,我需要传递一些值。 例如: [CustomAuthorize(GroupID = Method Parameter?] public ActionResult DoSomething(int GroupID) { return View(""); } 我想授权访问页面。 但这取决于传递给控制器​​的值。 因此,授权取决于groupID。 这有可能以任何方式实现这一目标吗? 提前致谢。 回答1 使用值提供者: public class CustomAuthorizeAttribute : FilterAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationContext filterContext) { var result = filterContext.Controller.ValueProvider.GetValue("GroupId"); //groupId should be of type `ValueProviderResult` if (result != null) { int groupId = int.Parse(result
  • Unauthorised webapi call returning login page rather than 401(Unauthorised webapi call returning login page rather than 401)
    问题 如何配置我的mvc / webapi项目,以便在未经授权的情况下从剃刀视图调用的webapi方法不返回登录页面? 它是一个MVC5应用程序,还具有WebApi控制器,可通过javascript进行调用。 下面的两种方法 [Route("api/home/LatestProblems")] [HttpGet()] public List<vmLatestProblems> LatestProblems() { // Something here } [Route("api/home/myLatestProblems")] [HttpGet()] [Authorize(Roles = "Member")] public List<vmLatestProblems> mylatestproblems() { // Something there } 通过以下角度代码调用: angular.module('appWorship').controller('latest', ['$scope', '$http', function ($scope,$http) { var urlBase = baseurl + '/api/home/LatestProblems'; $http.get(urlBase).success(function (data) { $scope.data =
  • ASP.NET MVC 4自定义Authorize属性-如何将未经授权的用户重定向到错误页面? [复制](ASP.NET MVC 4 custom Authorize attribute - How to redirect unauthorized users to error page? [duplicate])
    问题 这个问题已经在这里有了答案: ASP.NET MVC-如何在登录页面上显示未经授权的错误? (7个答案) 8年前关闭。 我正在使用自定义的authorize属性来根据用户的权限级别来授权用户的访问。 我需要重定向未经授权的用户(例如,用户尝试删除没有“删除访问权限”级别的发票)以访问被拒绝的页面。 自定义属性正在工作。 但是在未经授权的用户访问的情况下,浏览器中不会显示任何内容。 控制器代码。 public class InvoiceController : Controller { [AuthorizeUser(AccessLevel = "Create")] public ActionResult CreateNewInvoice() { //... return View(); } [AuthorizeUser(AccessLevel = "Delete")] public ActionResult DeleteInvoice(...) { //... return View(); } // more codes/ methods etc. } 自定义属性类代码。 public class AuthorizeUserAttribute : AuthorizeAttribute { // Custom property public string AccessLevel
  • Spring MVC角色和管理员权限(Spring MVC Role and Permission to Admin)
    问题 我是spring mvc的新手,在我现有的项目中,只有一个admin,并且他们有权更新数据,但是现在我需要创建2个新的admin,admin1和admin2,它们在登录时只能看到有限的页面,例如: 管理员登录时,他们可以在菜单栏中看到添加数据,更新数据,发布消息页面。 但如果是Admin1,则只能在菜单栏中看到“发布消息”页面。 因此,请指导我如何在Spring MVC中完成此任务。 回答1 您必须考虑使用Spring安全性来实现此目的。请检查以下内容 <http auto-config="true"> <intercept-url pattern="/admin*" access="ROLE_ADMIN" /> </http> 这意味着,只有具有“ ROLE_ADMIN”权限的用户才能访问URI / admin *。 如果未经授权的用户尝试访问它,将显示“ http 403访问被拒绝页面”。 您必须配置网址及其允许的访问 http://www.mkyong.com/spring-security/spring-security-access-control-example/上的一个简单示例 回答2 我有一个类似的用例,管理员可能要创建新角色,并为这些角色任意分配权限。 如果我要授权用户在其授予的权限中存在ROLE_* ,那么每次有人添加新角色或该角色的业务要求发生变化时
  • Unity使用参数将依赖项注入MVC​​过滤器类(Unity Inject dependencies into MVC filter class with parameters)
    问题 我正在使用Unity.MVC4依赖项注入来访问我的服务。 注入控制器构造函数时,一切都应正常进行,但是我现在想做的是在过滤器类中使用属性注入,以便可以从内部访问数据库。 在我开始这个问题之前,我在Google周围搜索并尝试了不同的示例,但是找不到适合我的解决方案。 Bootstrapper.cs public static class Bootstrapper { public static IUnityContainer Initialise() { var container = BuildUnityContainer(); DependencyResolver.SetResolver(new UnityDependencyResolver(container)); return container; } private static IUnityContainer BuildUnityContainer() { var container = new UnityContainer(); container.RegisterType<IAccountRepository, AccountRepository>(); container.RegisterType<IAdministrationRepository, AdministrationRepository>()
  • ASP.NET MVC中的访问控制取决于输入参数/服务层吗?(Access Control in ASP.NET MVC depending on input parameters / service layer?)
    问题 序言:这是一个哲学问题。 我正在寻找实现此目的的“正确”方式,而不是寻求实现此目的的“一种”方式。 假设我有一些产品,以及一个在这些产品上执行CRUD的ASP.NET MVC应用程序: mysite.example/products/1 mysite.example/products/1/edit 我使用的是存储库模式,所以这些产品的来源无关紧要: public interface IProductRepository { IEnumberable<Product> GetProducts(); .... } 我的存储库还描述了用户列表,以及他们是哪些产品的管理者(许多用户和产品之间)。 在该应用程序的其他位置,超级管理员正在对用户执行CRUD,并管理用户与允许其管理的产品之间的关系。 允许任何人查看任何产品,但仅允许被指定为特定产品的“管理员”的用户调用例如“编辑”操作。 我应该如何在ASP.NET MVC中实现它? 除非我错过了什么,否则我将无法使用内置的ASP.NET Authorize属性,因为首先我需要为每个产品使用不同的角色,其次我要知道要检查哪个角色才可以从存储库中检索了我的产品。 显然,您可以将这种情况推广到大多数内容管理情况-例如,仅允许用户编辑自己的论坛帖子。 仅允许StackOverflow用户编辑自己的问题-除非他们有2000或更多的回复... 例如
  • 为什么AuthorizeAttribute重定向到登录页面以进行身份​​验证和授权失败?(Why does AuthorizeAttribute redirect to the login page for authentication and authorization failures?)
    问题 在ASP.NET MVC中,可以使用AuthorizeAttribute标记控制器方法,如下所示: [Authorize(Roles = "CanDeleteTags")] public void Delete(string tagName) { // ... } 这意味着,如果当前登录的用户不具有“ CanDeleteTags”角色,则将永远不会调用控制器方法。 不幸的是,对于失败, AuthorizeAttribute返回HttpUnauthorizedResult ,该结果始终返回HTTP状态码401。这将导致重定向到登录页面。 如果用户未登录,那么这很有意义。 但是,如果用户已经登录,但没有所需的角色,则将他们发送回登录页面会造成混乱。 似乎AuthorizeAttribute将身份验证和授权混为一谈。 这似乎有点像ASP.NET MVC中的疏忽,还是我错过了一些东西? 我必须煮熟一个将DemandRoleAttribute分开的DemandRoleAttribute 。 当用户未通过身份验证时,它将返回HTTP 401,并将其发送到登录页面。 当用户登录但没有所需角色时,它将创建一个NotAuthorizedResult 。 当前,这将重定向到错误页面。 当然我不必这样做吗? 回答1 最初开发时,System.Web.Mvc
  • 动态添加角色以授权控制器属性(Dynamically add roles to authorize attribute for controller)
    问题 我需要使我的管理员用户能够即时更改用户的访问权限,以便他们可以创建新角色并向这些角色添加权限。 我希望能够创建一个Authorize属性,使其停留在我的控制器类之上,这样我就可以从数据库中添加角色了,这样我就不必在开发过程中“设置”角色,例如[Authorize(Roles="Role1, Role2")]等 所以像[Authorize(Roles = GetListOfRoles()] 我发现了这个问题-具有许多角色的ASP.NET MVC授权用户执行类似的操作,但是也许有一种方法可以更改它,使其从db获取权限/角色列表? 回答1 这就是我提取一个属性的方法,该属性可以根据该用户角色的权限来为每个方法授权用户。 我希望这对其他人有帮助: /// <summary> /// Custom authorization attribute for setting per-method accessibility /// </summary> [AttributeUsage(AttributeTargets.Method, AllowMultiple = false, Inherited = true)] public class SetPermissionsAttribute : AuthorizeAttribute { /// <summary> /// The name of
  • Django认证系统并不鸡肋反而很重要
    在使用django-admin startproject创建项目后,Django就默认安装了一个采用session实现的认证系统。这是Django相比于其他框架的一大特点:自带认证系统,开箱即用。有人说它方便,有人说它鸡肋,但它作为Django的重要组成部分,学习它有助于我们理解Django框架的核心技术。安装Django默认已安装,可以在settings.py中的INSTALLED_APPS看到:django.contrib.auth:认证系统内核,以及默认models等。django.contrib.contenttypes:用于关联权限和models,从而赋予models的添加/删除等权限。contrib翻译为普通发布版。在MIDDLEWARE可以看到:SessionMiddleware:session中间件。AuthenticationMiddleware:认证中间件。使用python manage.py migrate后,数据库会新增认证系统的这些表:认证与授权认证的英文是authentication,授权的英文是authorization。单词不一样,咋看有点像。认证是指验证用户是谁。授权是指授予已认证用户权限。由于认证授权在某种程序上是耦合的,所以Django把它们统称为“认证”。认证系统概览认证系统的组成部分如下:用户权限组密码管理登录相关表单(前后端分离不需要
  • ASP.NET MVC4重定向到登录页面(ASP.NET MVC4 Redirect to login page)
    问题 我正在使用ASP.NET MVC 4和C#创建一个Web应用程序。 我希望所有用户在使用应用程序之前均已登录。 我正在将ASP.NET Membership与自定义数据库一起使用。 一种方法是检查每个函数中的Membership.GetUser()是否为null。 但是,没有比在每个函数中检查用户登录状态更简单的方法了吗? (也许正在检查web.config,global.asax等...?) 回答1 当然,使用[Authorize]装饰您的动作或整个类,这将要求用户首先登录。 回答2 在您只希望登录用户访问的每个操作上都添加[Authorize] 。 您也可以在控制器级别执行此操作,以确保控制器内的所有操作均得到保护。 后者可能最适合您,因为您可能只希望对来宾禁用所有页面。 这是类级别的样子: [Authorize] public class SomethingController { //... } 这是一个操作级别的操作: public class SomethingController { [Authorize] public ActionResult SomeAction(Parameter someParameter) { //... } } 如果您的全部或大部分页面都使用相同的母版页,则另一种方法是: <script type="text/javascript>
  • 使用JWT的ASP.NET CORE令牌身份验证和授权(无Cookie)——第2部分
    目录 介绍 用户角色 如何创建自定义授权特性? AuthorizeAttribute AuthorizeFilter 如何在控制器和操作方法级别设置权限? 检查用户权限的扩展方法 如何在操作方法(内联代码)中检查权限? 如何控制视图页面内部的用户权限? 如何处理未授权的请求? 如何处理和身份验证/授权Ajax调用? 识别Ajax调用的扩展方法 在[UnAuthorized]过滤器特性中处理Ajax调用身份验证 在[Authorize]过滤器特性中处理Ajax调用授权 在Jquery中捕获Ajax调用的Http状态代码并重定向到登录页面 LoginDemo.sln项目 Login Page Landing Page 下载项目(在Visual Studio 2017中开发的LoginDemo项目)-2.1 MB 介绍 第1部分介绍了如何使用登录凭据对用户进行身份验证。在第2部分中,我们将了解如何为用户实现授权。换句话说,授予用户使用应用程序的某些部分或全部功能的权限。用户权限(授权)分为3个级别处理:控制器,操作方法和查看页面。为此,我们将编写自定义属性和少量扩展方法。第2部分包括单独的LoginDemo.sln项目,该项目使用下面涵盖的所有主题进行授权。 用户角色 让我们设置三个不同的角色: DirectorSupervisorAnalyst 创建一个static类Roles
  • ASP.NET MVC-如何在登录页面上显示未经授权的错误?(ASP.NET MVC - How to show unauthorized error on login page?)
    问题 在我的ASP.NET MVC应用中,大多数控制器都装饰有 [Authorize(Roles="SomeGroup")] 当用户无权访问某项内容时,他们将被发送到“〜/登录”,这是我的帐户控制器上的“登录”操作。 如何确定用户由于未获得授权而已进入登录页面,从而可以显示适当的错误? 回答1 您可以查找?ReturnUrl= querystring值,也可以创建自己的授权过滤器并在TempData设置一个指示原因的字段。 这是一个简单的自定义过滤器,可以解决这个问题: [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class CustomAuthorizeAttribute : AuthorizeAttribute { // NOTE: This is not thread safe, it is much better to store this // value in HttpContext.Items. See Ben Cull's answer below for an example. private bool _isAuthorized; protected override bool AuthorizeCore(System.Web.HttpContextBase
  • ASP.NET MVC-动态授权(ASP.NET MVC - Dynamic Authorization)
    问题 我正在构建一个简单的CMS,其中在管理面板中动态设置角色。 因此,授权控制器方法的现有方法(例如添加[Authorize(Roles="admin")]不再足够。 角色-动作关系必须存储在数据库中,以便最终用户可以轻松地在管理面板中向其他人授予/获取许可。 我该如何实施? 回答1 如果要控制授权过程,则应子类AuthorizeAttribute并重写AuthorizeCore方法。 然后,只需使用CmsAuthorizeAttribute而不是默认值)装饰控制器即可。 public class CmsAuthorizeAttribute : AuthorizeAttribute { public override virtual bool AuthorizeCore(HttpContextBase httpContext) { IPrincipal user = httpContext.User; IIdentity identity = user.Identity; if (!identity.IsAuthenticated) { return false; } bool isAuthorized = true; // TODO: perform custom authorization against the CMS return isAuthorized; } }
  • ASP.NET MVC中的ViewBag如何工作(How ViewBag in ASP.NET MVC works)
    问题 ASP.NET MVC的ViewBag如何工作? MSDN说这只是一个Object ,这使我很感兴趣,“魔术”属性(例如ViewBag.Foo和魔术字符串ViewBag["Hello"]实际上是如何工作的? 另外,如何制作一个并在我的ASP.NET WebForms应用程序中使用它? 实例将不胜感激! 回答1 ViewBag是dynamic类型,但在内部是System.Dynamic.ExpandoObject() 声明如下: dynamic ViewBag = new System.Dynamic.ExpandoObject(); 这就是为什么您可以这样做: ViewBag.Foo = "Bar"; 扩展器目标代码示例: public class ExpanderObject : DynamicObject, IDynamicMetaObjectProvider { public Dictionary<string, object> objectDictionary; public ExpanderObject() { objectDictionary = new Dictionary<string, object>(); } public override bool TryGetMember(GetMemberBinder binder, out object
  • Spring Security权限控制框架
    Spring Security简介 Spring Security是 Spring提供的安全认证服务的框架。 使用Spring Security可以帮助我们来简化认证和授权的过程。官网:https://spring.io/projects/spring-security 对应的maven坐标: <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-web</artifactId> <version>5.0.5.RELEASE</version> </dependency> <dependency> <groupId>org.springframework.security</groupId> <artifactId>spring-security-config</artifactId> <version>5.0.5.RELEASE</version> </dependency> 常用的权限框架除了Spring Security,还有Apache的shiro框架。 Spring Security入门案例 工程搭建 创建maven工程,打包方式为war,为了方便起见我们可以让入门案例工程依赖health_interface,这样相关的依赖都继承过来了。 pom
  • shiro+ssm授权方式之@RequiresPermissions()注解授权
    此案例使用IDEA创建的maven的web项目 步骤一:在pom.xml中导依赖 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <groupId>com.qf</groupId> <artifactId>ssm0923</artifactId> <version>1.0-SNAPSHOT</version> <packaging>war</packaging> <name>ssm0923 Maven Webapp</name> <!-- FIXME change it to the project's website --> <url>http://www.example.com</url> <properties> <project.build.sourceEncoding