zoukankan      html  css  js  c++  java
  • ASP.NET Core 五: MVC(控制器,模型,视图),过滤器,实现身份验证授权与多数据库上下文的使用

    概念说明:

    重点:控制器(路由,默认控制器,使用POCO基类和控制器,返回值),视图(模型与数据模型传递,Layout视图布局,部分视图,视图组件,视图中使用依赖注入,标记辅助程序(HTMLHelper,标记辅助程序),表单验证),动作过滤器,身份验证和授权(默认身份验证和授权,自定义身份验证授权)

    视图,Layout布局可以设置公共的布局,但是如果当前的页面不需要默认的默认的视图布局,可以设置指定目标视图布局或者为空布局(@{ Layout=null })。

    视图Section,如果在当前视图中,不希望所有内容都显示在同一个RendereBody中,而是希望显示在视图布局的其地方,则使用Section指定。

    部分视图可以指定局部显示,尤其对于一些很多页面都会显示的部分。部分视图有两种显示方式,一种是直接显示具体的页面,一种是从控制器中返回部分视图(这里相当于再次调用控制器方法,这可以用于类似Ajax的功能,比如点击按钮,访问页面进行局部刷新)。视图组件,和部分视图的第二种方式类似,或者说这是MVC的另一种构建,不过这里系统不再使用控制器,而是对视图组件专门的文件夹结构,官方文档或者相关书籍有具体的操作说明。

    HtmlHelper和标记辅助程序都有各自的优势以及类似的部分,并不是相互替代的关系,不过有时候为了在开发中方面清晰,个人比较偏向只使用标记辅助程序,标记辅助程序都是可以扩展的,可以编写自己的标记。

    过滤器,也叫筛选器,这里的过滤器可以说是中间件的一种特殊应用,不过这里就不纠结具体细节,跟着官方的文档用就行了。过滤器有有多种(操作过滤器,结果过滤器,资源过滤器)

    身份验证和授权,官方的提供身份验证框架有一个专门的数据库上下文,叫做IdentityDbContext,这个上下文也是继承自DbContext。可以让应用数据也使用这个上下文。当然为了使得应用降低耦合性,本人倾向于将两个上下文分开。

    过滤器:

    和中间件类似,如果把中间件看作是主管道,那么可以认为过滤器是专门针对mvc的次级管道。过滤器是用特性的方式注解在需要的控制器或者控制器的方法上,从而对相应的部分进行过滤处理。

    MVC框架提供了多种过滤器基类,比如结果过滤器,行为过滤器,等。可以通过过滤器进行中断操作,结果后处理等。具体可查阅官方文档。

    下面的例子,使用结果过滤器,给返回的内容上加上附加的内容字符串(HelloWorld)。

        public class ShortCircuitingFilterAttribute : Attribute, IActionFilter
        {
            public void OnActionExecuted(ActionExecutedContext context)
            {
                context.Result = new ContentResult()
                {
                    Content = context.Result + "-----HelloWorld"//在结果上添加附加的内容
                };
            }
    
            public void OnActionExecuting(ActionExecutingContext context)
            {
                
            }
        }
    public class HomeController : Controller
        {
            private readonly ILogger<HomeController> _logger;
    
            [ShortCircuitingFilter]//添加上过滤器特性
            public IActionResult SomeResource()
            {
                return Content("Successful access to resource - header is set.");
            }
    
            //Other Actions etc
        }

    身份认证:

    重要的几个概念:声明,身份,凭据,策略,授权

    声明(Claim)相当于标签,声明通常为字符串,当然也可以自定义声明的类型。

    身份(ClaimsIdentity)拥有多个声明,

    凭据由多个身份组成。

    策略(Policy)是在startup配置,比如某个策略,需要访问者即凭据,拥有某个角色,拥有哪些声明等,当授权单独指定某个策略时,那这个凭据就必须满足这个策略的所有条件才能访问这个资源。

    授权(Authrization),用于标识一个资源特性,可以决定访问这个资源的凭据需要有哪些声明,角色,或者策略。只有这个凭据满足这个授权指定的所有条件才能访问这个资源。

    Identiy的使用,除了官方文档,这里推荐教程:ASP.NET Core 3 - Authentication & Authorization -身份验证与授权(Youtube搬运)_哔哩哔哩_bilibili转自(https://www.youtube.com/watch?v=Fhfvbl_KbWo&list=PLOeFnOV9YBa7dnrjpOG6lMpcyd7Wn7E8V&index=1)

    关于Oauth,如果是第三方或者其他应用想要访问授权资源,那么这个应用就要先有授权,而这个授权的凭据就是Token,比如用户登录,登录成功之后返回这个凭据,在浏览器的通常凭据保存就是Cookie。这整个过程的协议就是Oauth,当然如果不想用这个标准,而想使用自己的设定,不怕风险也行。官方专门为Asp.net core编写的满足的Oauth和OpenID的框架就是IdentitySever4,由于本人暂时用不着,所以这里不学。

  • 相关阅读:
    @RequestParam注解使用:Name for argument type [java.lang.String] not available, and parameter name information not found in class file either.
    cglib动态代理导致注解丢失问题及如何修改注解允许被继承
    springboot Autowired BeanNotOfRequiredTypeException
    git根据用户过滤提交记录
    不同包下,相同数据结构的两个类进行转换
    How to use Jackson to deserialise an array of objects
    jooq实践
    java如何寻找main函数对应的类
    Python--matplotlib
    Python 和 Scikit-Learn
  • 原文地址:https://www.cnblogs.com/xiaoahui/p/15385731.html
Copyright © 2011-2022 走看看