最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

.NET?CORE?鑒權(quán)的實現(xiàn)示例

 更新時間:2022年02月20日 09:13:25   作者:Yony  
本文主要介紹了.NET?CORE?鑒權(quán)的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下

基礎(chǔ)信息

1.什么是鑒權(quán)授權(quán)?

  • 鑒權(quán)是驗證用戶是否擁有訪問系統(tǒng)的權(quán)利,授權(quán)是判斷用戶是否有權(quán)限做一些其他操作。

2.傳統(tǒng)的Session 和Cookie

  • 主要用于無狀態(tài)請求下的的用戶身份識別,只不過Session將信息存儲在服務(wù)端,Cookie將信息存儲在客戶端。

Session

  • 在客戶端第一次進行訪問時,服務(wù)端會生成一個Session id返回到客戶端

  • 客戶端將Session id存儲在本地后續(xù)每一次請求都帶上這個id

  • 服務(wù)端從接收到的請求中根據(jù)Session id在自己存儲的信息中識別客戶端

Cookie

  • 在客戶端訪問服務(wù)器時,服務(wù)端會在響應(yīng)中頒發(fā)一個Cookie

  • 客戶端會把cookie存儲,當再訪問服務(wù)端時會將cookie和請求一并提交

  • 服務(wù)端會檢查cookie識別客戶端,并也可以根據(jù)需要修改cookie的內(nèi)容

3.存在的問題

在分布式或集群系統(tǒng)中使用Session

假設(shè)現(xiàn)在服務(wù)器為了更好的承載和容災將系統(tǒng)做了分布式和集群,也就是有了N個服務(wù)端,那是不是每一個服務(wù)端都要具有對每一個客戶端的Session或者Cookie的識別能力呢?

這個可以使用Session共享的方式用于Session的識別,但是這并不能解決分布式系統(tǒng)下依然存在這個問題,因為通常每一個分布式系統(tǒng)都由不同的人負責或者跨網(wǎng)絡(luò),甚至不同的公司,不可能全部都做session共享吧?這個時候就誕生了一個新的方式,使用Token

4.Token

  • Token是服務(wù)端生成的一串字符串,以作客戶端進行請求的一個令牌。

執(zhí)行步驟

  • 用戶向統(tǒng)一的鑒權(quán)授權(quán)系統(tǒng)發(fā)起用戶名和密碼的校驗

  • 校驗通過后會頒發(fā)一個Token,用戶就拿著頒發(fā)的Token去訪問其他三方系統(tǒng)

  • 三方系統(tǒng)可以直接請求鑒權(quán)授權(quán)系統(tǒng)驗證當前Token的合法性,也可以根據(jù)對稱加密使用秘鑰解密Token以驗證合法性

.NET Core中鑒權(quán)

  • Authentication: 鑒定身份信息,例如用戶有沒有登錄,用戶基本信息

  • Authorization: 判定用戶有沒有權(quán)限

1.NET Core鑒權(quán)授權(quán)基本概念

在NETCORE中鑒權(quán)授權(quán)是通過AuthenticationHttpContextExtensions擴展類中的實現(xiàn)的HttpContext的擴展方法來完成的

 public static class AuthenticationHttpContextExtensions
 {
   public static Task SignInAsync(this HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties) 
   {
       context.RequestServices.GetRequiredService<IAuthenticationService>().SignInAsync(context, scheme, principal, properties);
   }         
 }

它真正的核心在
Microsoft.AspNetCore.Authorization模塊,整個流程處理主要包含如下幾個關(guān)鍵類

  • IAuthenticationHandlerProvider

負責對用戶憑證的驗證,提供IAuthenticationHandler處理器給IAuthenticationService用于處理鑒權(quán)請求,當然可以自定義處理器

  • IAuthenticationSchemeProvider

選擇標識使用的是哪種認證方式

  • IAuthenticationService

提供鑒權(quán)統(tǒng)一認證的5個核心業(yè)務(wù)接口

 public interface IAuthenticationService
 {
   //查詢鑒權(quán)
   Task<AuthenticateResult> AuthenticateAsync(HttpContext context, string scheme);
 
   //登錄寫入鑒權(quán)憑證
   Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties);
     
    //退出登錄清理憑證
   Task SignOutAsync(HttpContext context, string scheme, AuthenticationProperties properties);
   
   Task ChallengeAsync(HttpContext context, string scheme, AuthenticationProperties properties);
   
   Task ForbidAsync(HttpContext context, string scheme, AuthenticationProperties properties);
 }

在它的實現(xiàn)類AuthenticationService中的SignInAsync方法
配合IAuthenticationHandlerProvider 和IAuthenticationSchemeProvider得到一個IAuthenticationHandler,最終將鑒權(quán)寫入和讀取都由它完成

public virtual async Task SignInAsync(HttpContext context, string scheme, ClaimsPrincipal principal, AuthenticationProperties properties)
{      
   if (scheme == null)
    {
        //IAuthenticationSchemeProvider實例
        var defaultScheme = await Schemes.GetDefaultSignInSchemeAsync();
        scheme = defaultScheme?.Name;
    }

  //IAuthenticationHandlerProvider實例獲取處理器
  var handler = await Handlers.GetHandlerAsync(context, scheme);
  var signInHandler = handler as IAuthenticationSignInHandler;
  
  //各自的處理器handler 
  //例如使用Cookie 就會注入一個CookieAuthenticationHandler
  //使用JWT 就注入一個JwtBearerHandler
  await signInHandler.SignInAsync(principal, properties);
}

2.使用Cookie默認流程鑒權(quán)

  • 使用中間件加入管道,用于找到鑒權(quán)HttpContext.AuthenticateAsync()
   //核心源碼就是AuthenticationMiddleware中間件
   app.UseAuthentication();
  • 注入容器,將CookieAuthenticationHandler作為處理邏輯
services.AddAuthentication(options =>
{
     //CookieAuthenticationDefaults.AuthenticationScheme == "Cookies"
     options.DefaultAuthenticateScheme = "Cookies";
     options.DefaultSignInScheme = "Cookies";
}).AddCookie();
  • 在登錄時寫入憑證
  • Claims:一項信息,例如工牌的姓名是一個Claims ,工牌號碼也是一個Claims

  • ClaimsIdentity:一組Claims 組成的信息,就是一個用戶身份信息

  • ClaimsPrincipal:一個用戶有多個身份

  • AuthenticationTicket:用戶票據(jù),用于包裹ClaimsPrincipal

    
  [AllowAnonymous]
  public async Task<IActionResult> Login(string name, string password)
  {
      if(name!="Admin" && password!="000000")
      {
         var result = new JsonResult(new{ Result = false,Message = "登錄失敗"});
         return result;
      }
     //Claims  ? ClaimsIdentity ? ClaimsPrincipal
     var claimIdentity = new ClaimsIdentity("ClaimsIdentity");
     claimIdentity.AddClaim(new Claim(ClaimTypes.Name, name));
     claimIdentity.AddClaim(new Claim(ClaimTypes.Address, "地址信息"));
     
     AuthenticationProperties ap = new AuthenticationProperties();
     ClaimsPrincipal claimsPrincipal = new ClaimsPrincipal(claimIdentity);
     await base.HttpContext.SignInAsync("Cookies",claimsPrincipal , ap)
     return new JsonResult(new{ Result = false,Message = "登錄成功"});
  }

在其他控制器上標記[Authorize]特性,在訪問接口框架會自動進行鑒權(quán)并將身份信息寫入上下文

  • [AllowAnonymous]:匿名可訪問

  • [Authorize]:必須登錄才可訪問

3.自定義IAuthenticationHandler

  • 實現(xiàn)IAuthenticationHandler, IAuthenticationSignInHandler, IAuthenticationSignOutHandler三個接口
public class CoreAuthorizationHandler : IAuthenticationHandler
,IAuthenticationSignInHandler, IAuthenticationSignOutHandler
{
      public AuthenticationScheme Scheme { get; private set; }
      protected HttpContext Context { get; private set; }
      public Task InitializeAsync(AuthenticationScheme scheme, HttpContext context)
      {
          Scheme = scheme;
          Context = context;
          return Task.CompletedTask;
      }
      
     public async Task<AuthenticateResult> AuthenticateAsync()
     {
        var cookie = Context.Request.Cookies["CustomCookie"];
        if (string.IsNullOrEmpty(cookie))
        {
            return AuthenticateResult.NoResult();
        }
        AuthenticateResult result = AuthenticateResult
        .Success(Deserialize(cookie));
        return  await Task.FromResult(result);
    }
    
     public Task ChallengeAsync(AuthenticationProperties properties)
     {
          return Task.CompletedTask;
     }

     public Task ForbidAsync(AuthenticationProperties properties)
     {
          Context.Response.StatusCode = 403;
          return Task.CompletedTask;
     }
        
         public Task SignInAsync(ClaimsPrincipal user, AuthenticationProperties properties)
        {
            var ticket = new AuthenticationTicket(user, properties, Scheme.Name);
            Context.Response.Cookies.Append("CoreAuthorizationHandlerCookies", Serialize(ticket));
            return Task.CompletedTask;
        }

     public Task SignOutAsync(AuthenticationProperties properties)
     {
            Context.Response.Cookies.Delete("CoreAuthorizationHandlerCookies");
            return Task.CompletedTask;
     }
        
     private AuthenticationTicket Deserialize(string content)
     {
         byte[] byteTicket = System.Text.Encoding.Default.GetBytes(content);
         return TicketSerializer.Default.Deserialize(byteTicket);
     }
     private string Serialize(AuthenticationTicket ticket)
     {
        //需要引入  Microsoft.AspNetCore.Authentication
        byte[] byteTicket = TicketSerializer.Default.Serialize(ticket);
        return Encoding.Default.GetString(byteTicket);
     }
}

  • 在容器中注冊自定義的Handler
services.AddAuthenticationCore(options =>
{
   options.AddScheme<CoreMvcAuthenticationHandler>("AuthenticationScheme", "AuthenticationScheme");
});

 到此這篇關(guān)于.NET CORE 鑒權(quán)的實現(xiàn)示例的文章就介紹到這了,更多相關(guān).NET CORE 鑒權(quán) 內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • asp.net 中國身份證號碼驗證代碼 非正則

    asp.net 中國身份證號碼驗證代碼 非正則

    asp.net 中國身份證號碼驗證,需要的朋友可以參考下。
    2009-11-11
  • AntDesign Pro + .NET Core 實現(xiàn)基于JWT的登錄認證功能

    AntDesign Pro + .NET Core 實現(xiàn)基于JWT的登錄認證功能

    這篇文章主要介紹了AntDesign Pro + .NET Core 實現(xiàn)基于JWT的登錄認證功能,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2021-03-03
  • 詳解.NET Core 3.0 里新的JSON API

    詳解.NET Core 3.0 里新的JSON API

    這篇文章主要介紹了詳解.NET Core 3.0 里新的JSON API,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-03-03
  • asp.net 站點URLRewrite使用小記

    asp.net 站點URLRewrite使用小記

    asp.net的底層運作已經(jīng)也亂談過一番, 今天記一下URLRewrite的方法。
    2009-11-11
  • SQL通用存儲過程分頁,支持多表聯(lián)合

    SQL通用存儲過程分頁,支持多表聯(lián)合

    以前用.net寫分頁存儲過程時老是一張表就要寫一個procedure.很忙煩.后來有空就整合了一下,做了一個通用的sql分頁存儲,支持多表聯(lián)合查詢分頁.寫的不好的地方,希望大鳥們多多指導.使的查詢速度更快.
    2011-11-11
  • 國產(chǎn)化之銀河麒麟安裝.netcore3.1的詳細步驟(手動安裝)

    國產(chǎn)化之銀河麒麟安裝.netcore3.1的詳細步驟(手動安裝)

    這篇文章主要介紹了國產(chǎn)化之銀河麒麟安裝.netcore3.1的詳細步驟(手動安裝),本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下
    2022-03-03
  • 淺析GridView中顯示時間日期格式的問題

    淺析GridView中顯示時間日期格式的問題

    下面小編就為大家?guī)硪黄獪\析GridView中顯示時間日期格式的問題。小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-05-05
  • MVC使用Memcache+Cookie解決分布式系統(tǒng)共享登錄狀態(tài)學習筆記6

    MVC使用Memcache+Cookie解決分布式系統(tǒng)共享登錄狀態(tài)學習筆記6

    這篇文章主要介紹了MVC使用Memcache+Cookie解決分布式系統(tǒng)共享登錄狀態(tài)學習筆記,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2016-09-09
  • asp.net 彈出對話框返回多個值

    asp.net 彈出對話框返回多個值

    這是我寫的第一篇文章,呵呵。所以寫的詳細希望能幫到某些兄弟。前段時間做過一個項目。需要用到選擇對話框。當單擊選擇按鈕時要彈出一個網(wǎng)頁包含GridView。當單擊選擇時返回GridView中單元格的值。
    2009-11-11
  • asp.net?core?中的Jwt(Json?Web?Token)的使用詳解

    asp.net?core?中的Jwt(Json?Web?Token)的使用詳解

    session不支持分布式并且在服務(wù)器存儲一份用戶登錄的信息,這份登錄信息會在響應(yīng)時傳遞給瀏覽器,告訴其保存為cookie,以便下次請求時發(fā)送給我們的應(yīng)用,這篇文章主要介紹了asp.net?core?中的Jwt(Json?Web?Token)的使用,需要的朋友可以參考下
    2022-10-10

最新評論

孟津县| 四会市| 中西区| 宝坻区| 龙川县| 濉溪县| 龙游县| 定安县| 克山县| 绥江县| 平遥县| 剑川县| 忻州市| 南京市| 红原县| 尉犁县| 澄城县| 含山县| 会理县| 湖南省| 云梦县| 隆安县| 保康县| 邵东县| 博爱县| 溧阳市| 靖宇县| 乌拉特中旗| 巢湖市| 台南县| 东乡族自治县| 安义县| 晋江市| 永修县| 沁源县| 洪洞县| 贵阳市| 霍州市| 通江县| 芦溪县| 昭苏县|