Core知識整理

来源:https://www.cnblogs.com/Agui520/archive/2018/08/06/9428537.html
-Advertisement-
Play Games

概述 Commond-Line ASP.NET結構文件 Startup 配置文件 中間件和依賴註入 依賴註入原理 框架自帶的依賴註入(IServiceCollection) 依賴註入生命周期 依賴註入使用方式 通過構造函數 MVC的ActionAction中可以使用 [FromServices]來註 ...


概述

Commond-Line

ASP.NET結構文件

 

Startup

配置文件

 

中間件和依賴註入

依賴註入原理

框架自帶的依賴註入(IServiceCollection)

依賴註入生命周期

依賴註入使用方式

  • 通過構造函數
  • MVC的ActionAction中可以使用 [FromServices]來註入對象、

中間件(MiddleWare)

Use:進入中間件http管道模式,

Map:映射分支 Run:

執行,並返回Response

複製代碼
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
     app.UseMyMiddleware();
}

public class MyMiddleware
    {
        private readonly RequestDelegate _next;
        public MyMiddleware(RequestDelegate next)
        {
            _next = next;
        }
        public Task Invoke(HttpContext context)
        {
           //這裡是獲取context信息後處理的代碼
            return this._next(context);
        }
    }
    public static class MyMiddlewareExtensions
    {
        public static IApplicationBuilder UseMyMiddleware(
            this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<MyMiddlewareMiddleware>();
        }
    }
複製代碼

 

中間件的執行要註意順序,因為可以終止http管道的執行

框架自帶中間件

 

 ORM

Entity Framework Core

官方地址:https://docs.microsoft.com/zh-cn/ef/core/

services.AddDbContext<SchoolContext>(options =>options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

Entity Framework Core-Code First

//程式包管理控制項台
Install-Package Microsoft.EntityFrameworkCore.SqlServer
Install-Package Microsoft.EntityFrameworkCore.Tools
Install-Package Microsoft.VisualStudio.Web.CodeGeneration.Design

 

從資料庫生成模型

Scaffold-DbContext "Server=(localdb)\mssqllocaldb;Database=Blogging;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models

併發控制

複製代碼
//特性方式
public class Person
{
    public int PersonId { get; set; }

    [ConcurrencyCheck]
    public string LastName { get; set; }

    public string FirstName { get; set; }
}

//特性API方式

class MyContext : DbContext
{
    public DbSet<Person> People { get; set; }

    protected override void OnModelCreating(ModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Person>()
            .Property(p => p.LastName)
            .IsConcurrencyToken();
    }
}

public class Person
{
    public int PersonId { get; set; }
    public string LastName { get; set; }
    public string FirstName { get; set; }
}

//特性時間戳

public class Blog
{
    public int BlogId { get; set; }

    public string Url { get; set; }
    
    [Timestamp]
    public byte[] Timestamp { get; set; }
}

//時間戳 class MyContext : DbContext { public DbSet<Blog> Blogs { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Blog>() .Property(p => p.Timestamp) .IsRowVersion(); } } public class Blog { public int BlogId { get; set; } public string Url { get; set; } public byte[] Timestamp { get; set; } }
複製代碼

Dapper

官方地址:https://github.com/StackExchange/Dapper

 

許可權驗證

概念

Authentication:認證,通過自定義或三方的方式,確定用戶有效性,並分配用戶一定身份

Authorization:授權,決定用戶可以做什麼,可以帶上角色或策略來授權,並且是能過Controller或Action上的特性Authorize來授權的。

驗證方式

ConfigureServices中

複製代碼
//註入驗證 2.0
services.AddAuthentication(options =>
{
     options.DefaultChallengeScheme = "MyCookieAuthenticationScheme";
     options.DefaultSignInScheme = "MyCookieAuthenticationScheme";
     options.DefaultAuthenticateScheme = "MyCookieAuthenticationScheme";
})
.AddCookie("MyCookieAuthenticationScheme", opt =>
            {
     opt.LoginPath = new PathString("/login");
     opt.AccessDeniedPath = new PathString("/login");
     opt.LogoutPath = new PathString("/login");
     opt.Cookie.Path = "/";
});
複製代碼

Configure中

app.UseAuthentication();

登錄驗證

複製代碼
public class UserTestController : Controller  
{
      [HttpGet("users")]
      [Authorize(Roles = "admin,system")]
      public IActionResult Index()
      {     return View();      }
      [HttpGet("login")]
      public IActionResult Login(string returnUrl)
      {
          //1、如果登錄用戶已經Authenticated,提示請勿重覆登錄
          if (HttpContext.User.Identity.IsAuthenticated)
          {
              return View("Error", new string[] { "您已經登錄!" });
          }else//記錄轉入地址
          {
                    ViewBag.returnUrl = returnUrl;
          return View();}
      }
複製代碼

 

複製代碼
[AllowAnonymous]
[HttpPost("login")]
public IActionResult Login(string username, string returnUrl)
{
            //2、登錄後設置驗證
        if (username == "gsw")
        {
             var claims = new Claim[]{
                 new Claim(ClaimTypes.Role, "admin"),
                 new Claim(ClaimTypes.Name,"桂素偉")
             };
             HttpContext.SignInAsync("MyCookieAuthenticationScheme",new ClaimsPrincipal(new ClaimsIdentity(claims, "Cookie")));              
                //給User賦值 
                var claPris = new ClaimsPrincipal();
                claPris.AddIdentity(new ClaimsIdentity(claims));
                HttpContext.User = claPris;
                return new RedirectResult(returnUrl == null ? "users" : returnUrl);
            }
            else
            {
                return View();
            }
        }
複製代碼

UI訪問

複製代碼
//3、UI上訪問驗證信息
@if (User.IsInRole("abc"))
 {
     <p>你好: @User.Identity.Name</p>
     <a href="更高許可權">更高許可權</a>
 }
複製代碼

 

許可權中間件

複製代碼
/// <summary>
    /// 許可權中間件
    /// </summary>
    public class PermissionMiddleware
    {
        /// <summary>
        /// 管道代理對象
        /// </summary>
        private readonly RequestDelegate _next;

        /// <summary>
        /// 許可權中間件構造
        /// </summary>
        /// <param name="next">管道代理對象</param>
        /// <param name="permissionResitory">許可權倉儲對象</param>
        /// <param name="option">許可權中間件配置選項</param>
        public PermissionMiddleware(RequestDelegate next)
        {
         _next = next;
        }
        /// <summary>
        /// 調用管道
        /// </summary>
        /// <param name="context"></param>
        /// <returns></returns>
        public Task Invoke(HttpContext context)
        {
             return this._next(context);
        }
    }
複製代碼

自定義策略

複製代碼
/// <summary>
/// 許可權授權Handler
/// </summary>
public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
{
     /// <summary>
     /// 用戶許可權
     /// </summary>
     public List<Permission> Permissions { get; set; }

     protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
     {
         //賦值用戶許可權
         Permissions = requirement.Permissions;
         //從AuthorizationHandlerContext轉成HttpContext,以便取出表求信息
         var httpContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext).HttpContext;
         //請求Url
         var questUrl = httpContext.Request.Path.Value.ToLower();
         //是否經過驗證
         var isAuthenticated = httpContext.User.Identity.IsAuthenticated;
         if (isAuthenticated)
         {
             //許可權中是否存在請求的url
             if (Permissions.GroupBy(g => g.Url).Where(w => w.Key.ToLower() == questUrl).Count() > 0)
             {
                 var name = httpContext.User.Claims.SingleOrDefault(s => s.Type == requirement.ClaimType).Value;                   
                 //驗證許可權
                 if (Permissions.Where(w => w.Name == name && w.Url.ToLower() == questUrl).Count() > 0)
                 {
                     context.Succeed(requirement);
                 }
                 else
                 {
                     //無許可權跳轉到拒絕頁面
                     httpContext.Response.Redirect(requirement.DeniedAction);
                 }
             }
             else
             {
                 context.Succeed(requirement);
             }
         }
         return Task.CompletedTask;
     }
 }
複製代碼

 自定義策略-JWT

複製代碼
 /// <summary>
 /// 許可權授權Handler
 /// </summary>
 public class PermissionHandler : AuthorizationHandler<PermissionRequirement>
 {
     /// <summary>
     /// 驗證方案提供對象
     /// </summary>
     public IAuthenticationSchemeProvider Schemes { get; set; }
     /// <summary>
     /// 自定義策略參數
     /// </summary>
     public PermissionRequirement Requirement
     { get; set; }
     /// <summary>
     /// 構造
     /// </summary>
     /// <param name="schemes"></param>
     public PermissionHandler(IAuthenticationSchemeProvider schemes)
     {
         Schemes = schemes;
     }
     protected override async Task HandleRequirementAsync(AuthorizationHandlerContext context, PermissionRequirement requirement)
     {          
         ////賦值用戶許可權       
         Requirement = requirement;
         //從AuthorizationHandlerContext轉成HttpContext,以便取出表求信息
         var httpContext = (context.Resource as Microsoft.AspNetCore.Mvc.Filters.AuthorizationFilterContext).HttpContext;
         //請求Url
         var questUrl = httpContext.Request.Path.Value.ToLower();
         //判斷請求是否停止
         var handlers = httpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
         foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
         {
             var handler = await handlers.GetHandlerAsync(httpContext, scheme.Name) as IAuthenticationRequestHandler;
             if (handler != null && await handler.HandleRequestAsync())
             {
                 context.Fail();
                 return;
             }
         }
         //判斷請求是否擁有憑據,即有沒有登錄
         var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
         if (defaultAuthenticate != null)
         {
             var result = await httpContext.AuthenticateAsync(defaultAuthenticate.Name);
             //result?.Principal不為空即登錄成功
             if (result?.Principal != null)
             {                
                 httpContext.User = result.Principal;
                 //許可權中是否存在請求的url
                 if (Requirement.Permissions.GroupBy(g => g.Url).Where(w => w.Key.ToLower() == questUrl).Count() > 0)
                 {
                     var name = httpContext.User.Claims.SingleOrDefault(s => s.Type == requirement.ClaimType).Value;
                     //驗證許可權
                     if (Requirement.Permissions.Where(w => w.Name == name && w.Url.ToLower() == questUrl).Count() <= 0)
                     {
                         //無許可權跳轉到拒絕頁面
                         httpContext.Response.Redirect(requirement.DeniedAction);
                     }
                 }
                 context.Succeed(requirement);
                 return;
             }
         }
         //判斷沒有登錄時,是否訪問登錄的url,並且是Post請求,並且是form表單提交類型,否則為失敗
         if (!questUrl.Equals(Requirement.LoginPath.ToLower(), StringComparison.Ordinal) && (!httpContext.Request.Method.Equals("POST")
            || !httpContext.Request.HasFormContentType))
         {
             context.Fail();
             return;
         }
         context.Succeed(requirement);
     }
 }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Asp.NET中的路由配置,首先要提到的幾個相關類型,Route ,RouteBase,RouteData,RouteTable,RouteCollection 這幾個。下麵我一次回憶一下,有需要的朋友也可以作為參考,如果有問題也可以在留言區指出來,高手路過也請提出一些寶貴的意見。 ①Route 這 ...
  • 1、ini文件是什麼? 見百度百科:https://baike.baidu.com/item/ini%E6%96%87%E4%BB%B6/9718973?fr=aladdin 2、C#語言實現ini文件的讀寫操作 此博文為原創,轉載請註明出處!!!!! ...
  • 一、問題 ①ASP.NET項目,開發工具Visual Studio ②在IIS上發佈之後,網頁控制台報錯,某某文件找不到,但是在伺服器文件夾中看明明有那個文件 二、解決方法 ①》》打開IIS,點擊你的網站,在右邊視窗搜索找到MIME類型 》》右擊上方,新建MIME類型 》》如,字體woff > 文件 ...
  • 【1】註冊表是什麼? 百度百科 https://baike.baidu.com/item/%E6%B3%A8%E5%86%8C%E8%A1%A8/101856?fr=aladdin 【2】怎麼打開註冊表? Windows+R >>>>>> regedit 【3】C# 源碼 此博文為原創,轉載請註明出 ...
  • 第一種:利用MODEL拼成要輸出JSON的對象。再用JSON.NET轉成JSON輸出到前端(這種常用,就不舉例了。) 第二種:利用table拼成JSON數據格式,再用JSON.NET轉成JSON輸出到前端: dt = new DataTable(); dt.Columns.Add(new DataC ...
  • c#編寫的資料庫自動備份,windows服務,帶配置,帶服務,壓縮備份,定期清理備份等功能於一身 ...
  • 1. 簡介 "C 併發編程經典實例" 是一本關於使用C 進行併發編程的入門參考書,使用“問題 解決方案 討論”的模式講解了以下這些概念: 面向非同步編程的async和await 使用TPL(任務並行庫) 創建數據流管道的TPL Dataflow庫 基於LINQ的Reactive Extensions ...
  • 轉自:http://www.cnblogs.com/essenroc/p/8627775.html 這篇文章將介紹ASP.NET Core中使用 開源項目 Payment,實現接入支付寶-電腦網頁支付介面及同步跳轉及非同步通知功能。 開發環境:Win 10 x64、VS2017 15.6.4、.NET ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...