在asp.net core mvc中提供了权限验证框架,前面的文章中已经介绍了如何进行权限控制配置,权限配置好后,权限验证逻辑自动就会执行,但是在某些情况下,我们可能需要在代码里或者视图中通过手工方式判断权限,我们现在就来介绍下具体的操作方法。

如果在控制器方法里想要判断当前用户是否具有某个权限,可以直接使用HttpContext.User.HasClaim(string cliamtype,string cliamvalue)方法进行判断,该方法返回bool类型,返回true表示具有权限,否则不具有。

在视图上我们往往需要控制某个按钮或者超链接的权限,具有权限按钮就显示,否则不现实。那怎么样才能达到这样的效果?方法介绍如下:

1,在视图中直接使用HttpContext.User.HasClaim(string cliamtype,string cliamvalue)判断权限,然后控制按钮是否显示

@if(HttpContext.User.HasClaim("User","Delete"))

{

<input type='button' value="删除"/>

}

上面的代码写在视图中,表示如果具有用户的删除权限,就显示删除按钮。这种方式比如在所有需要验证的地方,都按照这样的格式去书写。

2,借助于asp.net core mvc的新特性taghelper可以简化第一种方式,至于什么是taghelper,以及它的作用这里就不再介绍,大家可以百度或谷歌搜索,这里直接介绍如何自定义权限验证的taghelper。

<a asp-claim="goods,edit" asp-action="addgoods" asp-route-id="@goods.Id" class="btn-icon " title="编辑"><i class="icon-common-edit icon-pencil"></i></a>

上面的代码是我们最终的效果,表示这个超链接是有在用户具有claim(type=goods,value=edit)权限的时候才显示,下面我们就来介绍如何实现这个taghelper。

1)首先我们定义一个类,派生自TagHelper类,并增加claim属性定义,并增加ViewContext

class ClaimTagHelper:TagHelper

{

private const string ClaimAttributeName = "asp-claim";
        public ClaimTagHelper()
        {
           
        }

        [HtmlAttributeName(ClaimAttributeName)]
        public string Claim { get; set; }

}

2)我们的权限控制taghelper只运用于button,a,input的元素上,所有我们需要加上HtmlTargetElement的特性,代码如下:

[HtmlTargetElement("a", Attributes = ClaimAttributeName)]
    [HtmlTargetElement("button", Attributes = ClaimAttributeName)]
    [HtmlTargetElement("input", Attributes = ClaimAttributeName, TagStructure = TagStructure.WithoutEndTag)]
    public class ClaimTagHelper: TagHelper

{

......

}

3)重写TagHelper的Process方法,在方法中使用HttpContext.User.HasClaim进行权限判断。在视图中访问HttpContext必须借助于ViewContext对象,所以我们需要在当前的TagHelper类中增加ViewContext引用,具体代码如下:

public class ClaimTagHelper: TagHelper

{

.....

[HtmlAttributeNotBound]
        [ViewContext]
        public ViewContext ViewContext { get; set; }

.....

}

基本条件都具备了,然后就是Process实现,直接上代码:

public override void Process(TagHelperContext context, TagHelperOutput output)
        {
            if (string.IsNullOrEmpty(Claim))
            {
                return;
            }

            string[] claimData = Claim.Split(new char[] { '-' }, StringSplitOptions.RemoveEmptyEntries);

            if (claimData.Length == 1)
            {
                if (!ViewContext.HttpContext.User.HasClaim(m => m.Type == claimData[0]))
                {
                    //无权限
                    output.SuppressOutput();
                }
            }
            else
            {
                if (!ViewContext.HttpContext.User.HasClaim(m => m.Type == claimData[0] && m.Value == claimData[1]))
                {
                    //无权限
                    output.SuppressOutput();
                }
            }

}

到这里就介绍完了,谢谢大家,如有不足之处,欢迎大家指导。

asp.net core mvc权限控制:在视图中控制操作权限的更多相关文章

  1. ASP.NET Core MVC之ViewComponents(视图组件)

    前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...

  2. ASP.NET Core MVC之ViewComponents(视图组件)知多少?

    前言 大概一个来星期未更新博客了,久违了各位,关于SQL Server性能优化会和ASP.NET Core MVC穿插来讲,如果你希望我分享哪些内容可以在评论下方提出来,我会筛选并看看技术文档来对你的 ...

  3. ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径

    IViewLocationExpander API ExpandViewLocations Razor视图路径,视图引擎会搜索该路径. PopulateValues 每次调用都会填充路由 项目目录如下 ...

  4. ASP.NET Core 入门教程 7、ASP.NET Core MVC 分部视图入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...

  5. ASP.NET Core 入门笔记8,ASP.NET Core MVC 分部视图入门

    一.前言 1.本教程主要内容 ASP.NET Core MVC (Razor)分部视图简介 ASP.NET Core MVC (Razor)分部视图基础教程 ASP.NET Core MVC (Raz ...

  6. ASP.NET Core 中文文档 第四章 MVC(01)ASP.NET Core MVC 概览

    原文:Overview of ASP.NET Core MVC 作者:Steve Smith 翻译:张海龙(jiechen) 校对:高嵩 ASP.NET Core MVC 是使用模型-视图-控制器(M ...

  7. ASP.NET Core MVC 概述

    https://docs.microsoft.com/zh-cn/aspnet/core/mvc/overview?view=aspnetcore-2.2 ASP.NET Core MVC 概述 20 ...

  8. ASP.NET Core MVC的路由参数中:exists后缀有什么作用,顺便谈谈路由匹配机制

    我们在ASP.NET Core MVC中如果要启用Area功能,那么会看到在Startup类的Configure方法中是这么定义Area的路由的: app.UseMvc(routes => { ...

  9. ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core MVC 设计模式 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core MVC 设计模式 上一章节中,我们提到 ASP.NET Co ...

随机推荐

  1. 关于LCD以及BMP和RGB565

    源: 关于LCD以及BMP和RGB565

  2. Spring+struts+ibatis(一)环境准备工作

    首先我们先了解几个jar包的作用和一些未曾见过的接口和类 xwork-2.0.7.jar XWork是一个标准的Command模式实现,并且完全从web层脱离出来.Xwork提供了很多核心功能:前端拦 ...

  3. runtime - associated(关联)

    category和associative作为objective-c的扩展机制的两个特性,category用来扩展类的方法,associative可以用来扩展类的属性.使用associative需要导入 ...

  4. STM8S awu及看门狗IWDG WWDG应用(转)

    源:STM8S awu及看门狗IWDG WWDG应用 AWU的应用(用库函数完成的) //切记要开启中断 且在中断函数中 AWU_GetFlagStatus(); 来清除中断 void AWU_SET ...

  5. FZU 1397 保送

    网络流入门题. 源点到每一个学生连一条边,容量为1 每个学校到汇点连一条边,容量为L 符合要求的学生和学校之间连边,容量为1. 从源点到汇点的最大流就是答案. #include<cstdio&g ...

  6. webstrom 编码

    设置文件保存格式: webstrom的右下角选择你需要的编码

  7. C语言-数组

    C语言中使用数组来存储相同类型的大批量数据. 数组: 数组名:起名规则和变量名一样: 定义数组:数组每个元素存储的数据类型+数组名[常量(时表示数组分配存储数据类型的个数也就是长度)]={每个元素,以 ...

  8. leetcode day6

    [13]Roman to Integer Given a roman numeral, convert it to an integer. Input is guaranteed to be with ...

  9. MVC+Repository+UOW+EntityFrmeWork的使用

    1.首先创建一个空的MVC3应用程序,命名为MyRepository.Web,解决方案命名为MyRepository. 2.添加一个类库项目,命名为MyRepository.DAL,添加一个文件夹命名 ...

  10. Windows 7 Professional安装多语言包

    本文出自 "王春海的博客" 博客,请务必保留此出处http://wangchunhai.blog.51cto.com/225186/223635 下载了Windows 7 Prof ...