認證
在安全領域,認證和授權是倆個重要的主題。認證是安全體系的第一道屏障,當訪問者進入的時候認證體系通過驗證對方提供的憑證票據確定其真實身份。認證體系只有在證實了訪問者的真實身份的情況下才會允許進入。asp.net core 提供了多種認證方式(基於Cookie、JWT等等)。
asp.net core 采用的是基於“票據“的認證機制及在登陸時通過HttpContext.SignInAsync()方法將ClaimsPrincipal(類似身份證)對象以及一些過期時間等等加密后寫入Cookie(僅Cookie認證模式),當頁面請求進入時通過中間件app.UseAuthentication()進行認證,通過認證的解析出用戶信息賦值給HttpContext.User(可以這么理解,但是實際上還涉及IIdentity IPrincipal Claim ClaimsIdentity 可以參考官方文檔)這樣進行授權鑒權時才能找的用戶信息,也就是你登錄時寫入Cookice中的信息,這里順便提一下授權鑒權使用的是app.UseAuthorization()他倆是親兄弟長得有點像
下面展示部分使用配置代碼:
public void ConfigureServices(IServiceCollection services) { services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { options.LoginPath = new PathString("/Fourth/Login"); options.AccessDeniedPath = new PathString("/Home/Privacy"); }); }
public void Configure(IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory) { app.UseSession(); app.UseHttpsRedirection(); app.UseStaticFiles(new StaticFileOptions() { FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), @"wwwroot")) }); app.UseRouting(); app.UseAuthentication();//鑒權,檢測有沒有登錄,登錄的是誰,賦值給HttpContext.User app.UseAuthorization();//就是授權,檢測權限 app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
以上是Startup中配置部分
下面是登陸位置的部分代碼
public async Task<ActionResult> Login(string name, string password) { ... //當帳號密碼驗證通過時 var claims = new List<Claim>() { new Claim(ClaimTypes.Name,name), new Claim(ClaimTypes.Role,"Admin"),//如果使用默認的權限管理此處不能自定義必須使用ClaimTypes.Role,ClaimTypes.Name 如果鑒權使用自定義策略 不做限制 new Claim("Account","Administrator")//可以隨便加 }; var userPrincipal = new ClaimsPrincipal(new ClaimsIdentity(claims, "Customer")); await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, userPrincipal, new AuthenticationProperties { ExpiresUtc = DateTime.UtcNow.AddMinutes(30), });//沒用await }
使用時在需要授權的Action或者是控制器上加[Authorize]注解該類的命名空間是namespace Microsoft.AspNetCore.Authorization,如果加在控制器上內部有Action不需要授權可以使用[AllowAnonymous]
退出登陸使用context.SignOutAsync(),給方法重定向到Cookie方案中配置的默認頁;
無權訪問重定向可以使用context.ChallengeAsync(),該方法重定向到Cookie方案中配置的默認頁