ASP.NET Core 五: MVC(控制器,模型,视图),路由,过滤器,实现身份验证授权与多数据库上下文的使用
概念说明:
重点:控制器(路由,默认控制器,使用POCO基类和控制器,返回值),视图(模型与数据模型传递,Layout视图布局,部分视图,视图组件,视图中使用依赖注入,标记辅助程序(HTMLHelper,标记辅助程序),表单验证),动作过滤器,身份验证和授权(默认身份验证和授权,自定义身份验证授权)
视图,Layout布局可以设置公共的布局,但是如果当前的页面不需要默认的默认的视图布局,可以设置指定目标视图布局或者为空布局(@{ Layout=null })。
视图Section,如果在当前视图中,不希望所有内容都显示在同一个RendereBody中,而是希望显示在视图布局的其地方,则使用Section指定。
部分视图可以指定局部显示,尤其对于一些很多页面都会显示的部分。部分视图有两种显示方式,一种是直接显示具体的页面,一种是从控制器中返回部分视图(这里相当于再次调用控制器方法,这可以用于类似Ajax的功能,比如点击按钮,访问页面进行局部刷新)。视图组件,和部分视图的第二种方式类似,或者说这是MVC的另一种构建,不过这里系统不再使用控制器,而是对视图组件专门的文件夹结构,官方文档或者相关书籍有具体的操作说明。
HtmlHelper和标记辅助程序都有各自的优势以及类似的部分,并不是相互替代的关系,不过有时候为了在开发中方面清晰,个人比较偏向只使用标记辅助程序,标记辅助程序都是可以扩展的,可以编写自己的标记。
过滤器,也叫筛选器,这里的过滤器可以说是中间件的一种特殊应用,不过这里就不纠结具体细节,跟着官方的文档用就行了。过滤器有有多种(操作过滤器,结果过滤器,资源过滤器)
身份验证和授权,官方的提供身份验证框架有一个专门的数据库上下文,叫做IdentityDbContext,这个上下文也是继承自DbContext。可以让应用数据也使用这个上下文。当然为了使得应用降低耦合性,本人倾向于将两个上下文分开。
控制器中的路由:
当访问控制器的时候,一般情况下除非特别限定(比如【HttpPost】或者【Route】),否则不管是否有参数,系统都会找一个名称对应的“最合适”的方法执行Action。具体如何获取参数,可以使用模型绑定(参考模型绑定和实例化文档部分)或者从Httpcontext中获取
过滤器:
和中间件类似,如果把中间件看作是主管道,那么可以认为过滤器是专门针对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,由于本人暂时用不着,所以这里不学。