1. 程式人生 > >在asp.net core中使用cookie認證

在asp.net core中使用cookie認證

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()
        {
            return
View(); } } }
View Code

在加了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
; options.MinimumSameSitePolicy = SameSiteMode.None; }); //2 CookieAuthenticationDefaults.AuthenticationScheme的值是一個字符串常量 "Cookies" //AddAuthentication 方法要求傳入的是一個字符串 我傳入的字符串是Cookies 就是說 使用Cookie 認證 services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme).AddCookie(); services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1); }
註入cookie認證

此時再訪問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認證