|
在大多数Web开发中,登录、验证权限都是必不可少的内容。
在 http://ASP.NET Core 中,微软提供了 http://ASP.NET Core Identity 来简化这个过程的开发。在一般情况下直接使用 Microsoft.AspNetCore.Identity.EntityFrameworkCore 和相关的库就能够在几行代码内实现一整套 http://ASP.NET Core Identity 的规范,适用性也比较强。
在你的http://ASP.NET Core项目中增加以下代码就能够实现
//你的 DbContext ,必须继承 IdentityDbContext
public class AppDbContext : IdentityDbContext
{
public AppDbContext(DbContextOptions options) : base(options){ }
}
//在 Startup.cs 的 ConfigureServices 添加如下代码
services.AddDbContext<AppDbContext>();
services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<AppDbContext>()
.AddDefaultTokenProviders();
//在 Startup.cs 的 Configure 添加如下代码
app.UseAuthentication();
app.UseAuthorization();
你就可以在项目中注入 UserManager,SignInManager 直接使用相关功能了,同时你的数据库会增加这样几个表格用来持久化Identity的信息:

<hr/>但是在实际开发中,有些无数据库系统或者特殊需要特殊验证的权限系统则不适应这一整套的EntityFrameworkCore 的实现,又或者觉得这些实现过于冗余。我见过很多人选择使用 Session 或者 Cookie 来实现自己的鉴权框架,虽然能够满足需求,但是常用的 AllowAnonymousAttribute , AuthorizeAttribute和 HttpContext.User 等一系列都得自己实现一套,显得特别突兀。
搜了一下国内的资料,似乎没有哪些文章专门讲过 http://ASP.NET Core Identity 的脱离数据库的最小实现,所以这里写一下,做个笔记:
//首先 在 Startup.cs 的 ConfigureServices 添加如下代码
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Cookie.Name = &#34;AppCookie&#34;;
options.LoginPath = &#34;/NeedToLogin&#34;;
});
//还是在 Startup.cs 的 Configure 添加如下代码
//验证用户身份
app.UseAuthentication();
//验证身份是否可以进行指定操作
app.UseAuthorization();在配置了这些服务之后,你可以在需要登录的地方这样去操作
//根据情况组建你的身份信息,至于 Claim,ClaimsIdentity 和 ClaimsPrincipal 之间的关系可以看一下其它文章
var principal = new ClaimsPrincipal(new ClaimsIdentity[]
{
new ClaimsIdentity(new Claim[]
{
new Claim(ClaimTypes.Name,&#34;boo&#34;),
new Claim(&#34;CustomClaim&#34;, &#34;Good guy&#34;)
}, &#34;Default&#34;)
});
await HttpContext.SignInAsync(principal);在你需要退出登录的地方使用
await HttpContext.SignOutAsync();上面代码非常简单,如果有扩展阅读需求可以去看看官方文档。
<hr/>这样实现后仍可以利用 http://ASP.NET Core 里头跟 Microsoft.AspNetCore.Authorization 相关的比如 AuthorizeAttribute\AllowAnonymousAttribute 及其他一些类,也可以在上面代码的基础上根据需要扩展实现有关 Policy 和 Role 的内容。
总之于自己使用 Cookie 来实现相对优雅一些,也方便了今后的扩展。毕竟 Microsoft.AspNetCore.Authorization 相关的内容非常多,直接利用起来不用自己写,会少掉许多头发的。 |
|