access 根据id删除数据_asp.net core根据用户权限控制页面元素的显示

asp.net core根据用户权限控制页面元素的显示

Intro

在 web 应用中我们经常需要根据用户的不同允许用户访问不同的资源,显示不同的内容,之前做了一个 AccessControlHelper 的项目,就是解决这个问题的。

asp.net core 支持 TagHelper 和 基于 Policy 的认证

AccessControlHelper 从1.4.0 版本开始支持 TagHelper 和 基于 Policy 的认证

TagHelper 用法

在 Views 目录下的 ~ViewImport.cshtml 中加入 TagHelper 引用

@addTagHelper *, WeihanLi.AspNetMvc.AccessControlHelper

在需要有权限才能访问的元素上加上 asp-access ,支持自定义一个key,如果有特殊的key可以设置 asp-access-key,下面有个示例

class="list-group" asp-access asp-access-key="12334">

role="separator" class="list-unstyled">

/>

class="list-group-item">@Html.ActionLink("用户管理", "UserList", "Account")

class="list-group-item">@Html.ActionLink("操作日志查看", "Index", "OperationLog")

class="list-group-item">@Html.ActionLink("系统设置管理", "Index", "SystemSettings")

class="list-group-item">

@Html.ActionLink("微信设置管理", "Index", new {

controller = "Config",

area = "Wechat"

})

示例代码完整源码

实现自己的访问策略

可以参考这个项目的实现 https://github.com/WeihanLi/ActivityReservation/blob/dev/ActivityReservation.Helper/Services/PermissionRequireStrategy.cs

public class AdminPermissionRequireStrategy : IResourceAccessStrategy

{

private readonly IHttpContextAccessor _accessor;

public AdminPermissionRequireStrategy(IHttpContextAccessor accessor)

{

_accessor = accessor;

}

public bool IsCanAccess(string accessKey)

{

var user = _accessor.HttpContext.User;

return user.Identity.IsAuthenticated && user.IsInRole("Admin");

}

public IActionResult DisallowedCommonResult => new ContentResult

{

Content = "No Permission",

ContentType = "text/plain",

StatusCode = 403

};

public IActionResult DisallowedAjaxResult => new JsonResult(new JsonResultModel

{

ErrorMsg = "No Permission",

Status = JsonResultStatus.NoPermission

});

}

public class AdminOnlyControlAccessStragety : IControlAccessStrategy

{

private readonly IHttpContextAccessor _accessor;

public AdminOnlyControlAccessStragety(IHttpContextAccessor httpContextAccessor) => _accessor = httpContextAccessor;

public bool IsControlCanAccess(string accessKey)

{

var user = _accessor.HttpContext.User;

return user.Identity.IsAuthenticated && user.IsInRole("Admin");

}

}

这个示例实现的比较简单,只是判断了一下是否有 Admin 角色,可以根据实际情况根据请求的地址以及当前登录用户及其它可能用到的信息去判断是否有权限访问。

注册服务

在 Startup 文件中 ConfigureServices 中注册权限服务,注册自己的访问策略

// register access control service

services.AddAccessControlHelper<Filters.AdminPermissionRequireStrategy, Filters.AdminOnlyControlAccessStragety>();

Policy 访问使用

在需要设置权限的 Action 或者 Controller 上加 [Authorize("AccessControl")] 或者 [Authorization(Policy="AccessControl")]

这两种方式是 asp.net core 下支持的 Policy 方式使用 也支持比较传统的直接使用 [AccessControl]AccessControlNoAccessControl 可以搭配使用, 类似于 AuthorizeAllowAnoymous

TagHelper 使用效果实例

测试登录地址

普通用户: Alice/Test1234 管理员: admin/Admin888

请不要修改密码/或者删除已有账号。。。

查看后台首页

管理员用户登录看到的界面:

092a3d3f93aefcfc6a792796cda44c07.png

查看源码:

class="table-body" id="div_main">

class="list-group">

class="list-group" asp-access>

普通用户登录看到的界面:

5d36a56eed3a06ad2aa7baa92fc7c47e.png

查看源码:

class="table-body" id="div_main">

class="list-group">

Reference

  • Github

  • Nuget

  • 示例项目

  • 实例项目

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值