在asp.net core中使用cookie認證
阿新 • • 發佈:2018-11-13
local 不知道 file version sent space 如何 使用 pub
以admin控制器為要認證的控制器舉例
1.對控制器設置權限特性
//a 認證命名空間 using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; namespace CookieBasedAuth.Controllers { //b 認證特性 [Authorize] public class AdminController : Controller { public IActionResult Index() { returnView CodeView(); } } }
在加了Authorize特性之後,訪問admin控制器的index方法,頁面會顯示異常,異常告訴我們,沒有指定認證框架,它不知道如何來認證挑戰
2.為程序註入Cookie認證框架
a.首先要引入兩個程序集
//1 為了Cookie認證證明 引入的以下兩個命名空間 認證命名空間 和 認證Cookie命名空間 using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies;認證和cookie框架命名空間的引入
b.在服務中註入認證
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true註入cookie認證; options.MinimumSameSitePolicy = SameSiteMode.None; }); //2 CookieAuthenticationDefaults.AuthenticationScheme的值是一個字符串常量 "Cookies" //AddAuthentication 方法要求傳入的是一個字符串 我傳入的字符串是Cookies 就是說 使用Cookie 認證 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
此時再訪問admin控制器的index方法,已經不報異常了,而是直接跳轉到account/login
http://localhost:60208/Account/Login?ReturnUrl=%2Fadmin
3.創建Account控制器 在此不挑戰,直接授予權限
//引入認證相關的命名空間 using Microsoft.AspNetCore.Authentication; using Microsoft.AspNetCore.Authentication.Cookies; using Microsoft.AspNetCore.Mvc; using System.Collections.Generic; //引入安全相關的命名空間 using System.Security.Claims; namespace CookieBasedAuth.Controllers { public class AccountController : Controller { public IActionResult Login() { var claims = new List<Claim>{ new Claim(ClaimTypes.Name,"應龍"), new Claim(ClaimTypes.Role,"國王") }; //千萬要註意下面的new ClaimsIdentity的構造函數,第二個參數要指明認證框架,要和服務中註入的框架一致 都是cookie var claimIdentity = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme); HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, new ClaimsPrincipal(claimIdentity)); return Ok(); } } }授權
即便授權了,我們請求admin控制器的index方法,會跳轉到account控制器的login方法。按想象的此時授權了,就應該可以訪問admin控制器的index了,然而我們會發現沒有用,也就是說沒有授權,還是會跳轉到account/login
4.將cookie驗證加入到中間件
public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); } app.UseStaticFiles(); app.UseCookiePolicy(); //將認證中間件弄進來 使得我們的請求會進入認證管道 app.UseAuthentication(); app.UseMvc(routes => { routes.MapRoute( name: "default", template: "{controller=Home}/{action=Index}/{id?}"); }); }將認證授權加入到中間件
完成 !
在asp.net core中使用cookie認證