浅谈 asp.net core 中关于 Authentication 和 Authorization

理解 认证(Authentication) 和 授权 (Authorization) 的概念

在开始之前我们得搞清楚这两者的区别. 认证是我们在访问某数据资源的时候, 需要提供一个身份identity, 然后server拿着这个identity, 去某个存储容器中去匹配, 如果匹配上了, 证明认证成功.
至于是否你有权限访问这个资源, 需要看是否你对这个资源有权限, 想获取权限, 就必须给你的identity授权, 也就是让你有权限去访问资源.所以两个动作描述的阶段时不一样的.

所以简单点来说, 这两者一结合, 就相当于访问者访问 web server资源的一个过程. 首先访问者得持有一个login user, 用于登录web server. 然后web server这面也会持有一个访问者清单. 只有当
login user与清单中的user相匹配才能访问web server. 但是这个login user如果想访问的资源必须得到相应的权限级别. 有的机密文件则需要申请, 得到admin的 approve. 这个过程叫授权.

关于在 asp.net core 中支持 Authentication

services.AddAuthentication

可以在 startup.cs 中的 configureservice 方法内部注入 IAuthenticationService 中间件. 这个 Authentication service 会使用注册到程序的 Authentication handler 进行相应的认证逻辑. 这些注册的 Authentication handelers 被称为 schemas. 所以我们通常见在 Startup.ConfigureServices 见到这样的配置:

services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
    .AddJwtBearer(JwtBearerDefaults.AuthenticationScheme, options => Configuration.Bind("JwtSettings", options))
    .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options => Configuration.Bind("CookieSettings", options);

此处有多个 schema 被注册了进来. 所以在后面进行身份认证时, 就可以根据实际需要, 去使用不同的 schema 去进行认证. 使用方式也很简单, 比如对某个 Controller 使用 jwt 认证:

[Authorize(AuthenticationSchemes = 
    JwtBearerDefaults.AuthenticationScheme)]
public class MixedController : Controller

具体可以参考微软文档:

Authorize with a specific scheme in ASP.NET Core

services.AddDefaultIdentity

如果 asp.net core 项目是 web MVC 项目, 并且搭配了 individual users 模板, 我们可能会在 startup.configureservice 中看到这样的注入行为:

services.AddDbContext<ApplicationDbContext>(options =>
        options.UseSqlServer(
            Configuration.GetConnectionString("DefaultConnection")));
    services.AddDefaultIdentity<IdentityUser>(options => options.SignIn.RequireConfirmedAccount = true)
        .AddEntityFrameworkStores<ApplicationDbContext>();
    services.AddRazorPages();

AddAuthentication 实际上是内置在 AddDefaultIdentity 里面了. 所以不用额外去再加一次.

app.UseAuthentication();

无论项目使用哪种方式将 Authentication Service 注入进来, 都需要在 startup.configure 中执行:

app.UseRouting()
app.UseAuthentication();
aspp.UseEndpoints();

将其添加到 http 请求响应的管道中去. 并且配置的相对顺序不能变.

了解一些 Authentication 相关的术语

  • Schema

一般是根据你添加的认证方式, 以及配置的 options, 去对 http request 请求进行身份认证. 所以 AddJwtBearer, 就是添加了 jwt 认证方式, AddCookie 其实就是添加了 cookie 认证.

  • Challenge

这里是指认证的过程, 比如当匿名用户请求登录或点击受限的资源链接。Authentication Service 会根据相应的或者默认的 Schema 进行认证的过程。 通常情况下, 基于 cookie 的认证会将用户重定向到 login 界面. 而基于 jwt 的认证, 则会返回 401 的 code.

  • Forbid

Forbid 发生在身份认证通过以后的鉴权阶段, 由 Authorization service 判定 user 是否有权限访问资源. 当用户无权限访问资源时, 基于 cookie 的认证会在此阶段将用户重定向到一个显示 'user 无权限访问 ' 的page. 而基于 jwt 的认证会返回一个 403 code.

猜你喜欢

转载自www.cnblogs.com/it-dennis/p/12486982.html