首页 > 作文

ASP.NET MVC授权过滤器用法

更新时间:2023-04-06 04:06:17 阅读: 评论:0

过滤器

过滤器(filter)的出现使得我们可以在asp.net mvc程序里更好的控制浏览器请求过来的url,并不是每个请求都会响应内容,只有那些有特定权限的用户才能响应特定的内容。过滤器理论上有以下功能:

判断登录与否或者用户权限。决策输出缓存。防盗链。防蜘蛛。本地化与国际化设置。实现动态action(做权限管理系统经常用到)。

1、使用方式一

第一种方法是在controller或action上面直接使用authorize特性,不设置特性的任何属性。看下面的截图:

从上面的截图中可以看出:第一个名为index的action方法是没有过滤的,任何身份的请求都可以通过。只需要在浏览器的url地址栏里面输入:http://localhost:**/admin/index就能得到对应的视图响应,效果如下:

而第二个名为welcome的action方法上面使用了authorize特性,表示这是一个只处理那些通过身份验证的url的请求,页面请求效果如下:

这时可以看到报错了:提示只有通过身份验证的用户才能访问请求所需的资源。

这种报错页面很不友好,一般这种情况都是跳转到登录页面让用户进行登录,所以对程序进行如下的改造。

1.1、添加登录页面

新建account控制器,并新建两个acti移动硬盘不显示on方法,代码如下:

using mvcauthorizefilterdemo.models;using system;using system.collections.generic;using system.linq;using system.web;using system.web.mvc;using system.web.curity;namespace mvcauthorizefilterdemo.controllers{    public class accountcontroller : controller    {        // get: account        public actionresult index()        {            return view();        }        /// <summary>        /// 显示登录视图        /// </summary>        /// <returns></returns>        public actionresult logon()        {       红歌会曲目     logonviewmodel model = new logonviewmodel();            return view(model);        }        /// <summary>        /// 处理用户点击登录提交回发的表单        /// </summary>        /// <param name="model"></param>        /// <returns></returns>        [httppost]        public actionresult logon(logonviewmodel model)        {            //只要输入的用户名和密码一样就过            if (model.urname.trim() == model.password.trim())             {                // 判断是否勾选了记住我                if (model.remembe二月份适合发朋友圈的句子rme)                {                    //2880分钟有效期的cookie                    formsauthentication.tauthcookie(model.urname, true);                }                            el                {                    //会话cookie                    formsauthentication.tauthcookie(model.urname, fal);                 }                 // 跳转到account控制器的welcome方法                return redirecttoaction("welcome", "admin");            }            el            {                return view(model);            }                        }    }}

logonviewmodel是用户登录实体类,定义如下:

using system;using system.collections.generic;using system.componentmodel;using system.linq;using system.web;namespace mvcauthorizefilterdemo.models{    // <summary>    /// 用户登录实体类    /// </summary>    public class logonviewmodel    {        /// <summary>        /// 用户名        /// </summary>        [displayname("用户名")]        public string urname { get; t; }        /// <summary>        /// 密码        /// </summary>        [displayname("密码")]        public string password { get; t; }        /// <summary>        /// 记住我        /// </summary>        [displayname("记住我")]        public bool rememberme { get; t; }    }}

logon视图页代码如下:

@model mvcauthorizefilterdemo.models.logonviewmodel@{    layout = null;}<!doctype html><html><head>    <meta name="viewport" content="width=device-width" />    <title>logon</title></head><body>    @using (html.beginform())    {        @html.antiforgerytoken()        <div class="form-horizontal">            <h4>登录</h4>            <hr />            @html.validationsummary(true)            <div class="form-group">                @html.labelfor(model => model.urname, new { @class = "control-label col-md-2" })                <div class="col-md-10">                    @html.editorfor(model => model.urname)                    @html.validationmessagefor(model => model.urname)                </div>            </div>            <div class="form-group">                @html.labelfor(model => model.password, new { @class = "control-label col-md-2" })                <div class="col-md-10">                    @html.editorfor(model => model.password)                    @html.validationmessagefor(model => model.password)                </div>            </div>            <div class="form-group">                @html.labelfor(model => model.rememberme, new { @class = "control-label col-md-2" })                <div class="col-md-10">                    @html.editorfor(model => model.rememberme)                    @html.validationmessagefor(model => model.rememberme)                </div>            </div>            <div class="form-group">                <div class="col-md-offt-2 col-md-10">                    <input type="submit" value="登录" class="btn btn-default" />                </div>            </div>        </div>    }</body></html>

1.2、修改配置文件

在上面的案例中,如果权限认证没有通过会显示错误页面,这种情况下要跳转到登录页面让用户进行登录,所以要再配置文件里面配置登录页面,如果没有通过身份认证就会跳转到配置文件里面配置的登录页面,配置文件代码如下:

<!--配置登录页面--><authentication mode="forms">   <forms loginurl="~/account/logon" timeout="2880" /></authentication>

1.3、测试

改造完以后重新生成,在url地址栏里面输入:http://localhost:39175/admin/index,页面显示效果如下:

在访问welcome方法,输入:http://localhost:39175/admin/welcome,页面显示效果如下:

保送研究生

从上图中可以看出虽然访问的是welcome这个action,但是并没有直接返回相应的视图,而是被带到了登录页面,这是因为welcome这个action上面使用了authorize特性,拒绝了所有未登录用户的访问。

上面既然拒绝了未验证用户的访问,那么就登录下通过验证。看上面logon里面的代码就知道,只要输入的用户名和密码相同就可以登录,都输入“admin”,这时页面显示如下:

截图表明已经通过验证并且得到了welcome这个action的相应。按f12打开控制台,会发现这时多了一个名为“.aspxauth”的cookie,这个是默认名称,在配置文件里面可以修改。如果登录的时候勾选了记住我,那么此cookie的过期时间就是在配置文件里面定义的2880分钟。

2、使用方式二

权限过滤器的第二种用法:基于用户授权和基于角色授权。

基于角色授权就是给authorize特性的roles属性赋值,多个角色可以使用逗号分隔。基于用户授权就是给authorize特性的urs属性赋值,如果是多个用户也可以使用逗号分隔。验证不通过时也可以通过web.config进行配置。

继续基于上面的案例进行改造,只允许登录名为“a”、“b”的两个用户可以访问welcome方法,改造后的代码如下:

using system;using system.collections.generic;using system.linq;using system.web;using system.web.mvc;namespace mvcauthorizefilterdemo.controllers{    public class admincontroller : controller    {        // get: admin        public actionresult index()        {            return view();        }        /// <summary>        /// 使用方式一:直接使用authorize特性,特性不添加任何属性        /// </summary>        /// <returns></returns>        //[authorize]        //public actionresult welcome()        //{        //    return view();        //}        /// <summary>        /// 使用方式二:使用authorize特性,添加urs属性,只能a、b登录用户才可以访问        /// </summary>        /// <returns></returns>        [authorize(urs ="a,b")]        public actionresult welcome()        {            return view();        }    }}

再次访问http://localhost:39175/admin/welcome,然后用admin登录,这时会发现页面不会跳转到welcome方法对应的页面,还是显示登录页。如果换成a或者b登录就会显示welcome对应的页面了,这说明设置的urs属性起作用了。

在上面的案例中,给authorize特性的urs属性赋值就可以控制可以访问的用户了,从操作性上来说这样控制action的访问权限还是很方便的。但是如果项目很大,用户对应的角色和权限变化比较大,每次变化都要修改代码来重新标注action显然不合适。这时该如餐饮业何解决呢?这就可以用mvc提供的自定义过滤器了。下篇文章讲解自定义权限过滤器。

到此这篇关于asp.net mvc授权过滤器用法的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持www.887551.com。

本文发布于:2023-04-06 04:06:04,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/191315372f72ddcaf8d53f14a74772a5.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:ASP.NET MVC授权过滤器用法.doc

本文 PDF 下载地址:ASP.NET MVC授权过滤器用法.pdf

标签:页面   用户   特性   过滤器
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图