在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. 【python】matplotlib在windows下安装

    昨晚装了好久的这玩意,终于在凌晨成功搞定,然后跑起了一个人人网抓取好友关系的脚本~开心. 以下是我参考的最给力的文档,全部安装一遍,就可以啦~ 但是!在安装前一定要先确认自己的python版本!本人自 ...

  2. LPC1788的EMC驱动norflash

    Norflash型号为sst39vf32 #ifndef __NORFLASH_H_ #define __NORFLASH_H_ #include "common.h" #incl ...

  3. Base64图片与UIImage的相互转化

    http://blog.csdn.net/fudesign2008/article/details/38903085 Base64图片 -> UIImage - (UIImage *) data ...

  4. Linux ALSA声卡驱动之二:声卡的创建

    1. struct snd_card 1.1. snd_card是什么 snd_card可以说是整个ALSA音频驱动最顶层的一个结构,整个声卡的软件逻辑结构开始于该结构,几乎所有与声音相关的逻辑设备都 ...

  5. 【转】C\C++代码优化的27个建议

    1. 记住阿姆达尔定律: funccost是函数func运行时间百分比,funcspeedup是你优化函数的运行的系数. 所以,如果你优化了函数TriangleIntersect执行40%的运行时间, ...

  6. 【转】Linux强大命令 Awk 20分钟入门介绍

    什么是Awk Awk是一种小巧的编程语言及命令行工具.(其名称得自于它的创始人Alfred Aho.Peter Weinberger 和 Brian Kernighan姓氏的首个字母).它非常适合服务 ...

  7. Windows录音API学习笔记(转)

    源:Windows录音API学习笔记 Windows录音API学习笔记 结构体和函数信息  结构体 WAVEINCAPS 该结构描述了一个波形音频输入设备的能力. typedef struct { W ...

  8. BZOJ1119[POI2009]SLO && BZOJ1697[Usaco2007 Feb]Cow Sorting牛排序

    Problem J: [POI2009]SLO Time Limit: 30 Sec  Memory Limit: 162 MBSubmit: 622  Solved: 302[Submit][Sta ...

  9. MySQL5.6-Tomcat7环境变量的配置

    一.MySQL环境变量配置(zip安装):系统-高级系统设置--环境变量--path添加D:\Mysql\bin 找到mysql解压目录下的my-default.ini文件修改 basedir = D ...

  10. UVa 10057 - A mid-summer night's dream

    题目大意:给n个数,找一个数A使得A与这n个数的差的绝对值最小.输出A最小的可能值,n个数中满足A的性质的数的个数以及满足A性质的不同的数的个数(不必从这n个数中挑选). 看见绝对值就想到了数轴上点之 ...