ASP.NET WebApi總結之自定義許可權驗證

来源:https://www.cnblogs.com/buyixiaohan/archive/2018/01/13/8278544.html
-Advertisement-
Play Games

在.NET中有兩個AuthorizeAttribute類, 一個定義在System.Web.Http命名空間下 #region 程式集 System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35... ...


在.NET中有兩個AuthorizeAttribute類,

一個定義在System.Web.Http命名空間下

#region 程式集 System.Web.Http, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// E:\src\packages\Microsoft.AspNet.WebApi.Core.5.2.3\lib\net45\System.Web.Http.dll
#endregion

using System.Web.Http.Controllers;
using System.Web.Http.Filters;

namespace System.Web.Http
{
    //
    // 摘要:
    //     指定用於驗證請求的 System.Security.Principal.IPrincipal 的授權篩選器。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : AuthorizationFilterAttribute
    {
        //
        // 摘要:
        //     初始化 System.Web.Http.AuthorizeAttribute 類的新實例。
        public AuthorizeAttribute();

        //
        // 摘要:
        //     獲取或設置授權角色。
        //
        // 返回結果:
        //     角色字元串。
        public string Roles { get; set; }
        //
        // 摘要:
        //     獲取此特性的唯一標識符。
        //
        // 返回結果:
        //     此特性的唯一標識符。
        public override object TypeId { get; }
        //
        // 摘要:
        //     獲取或設置授權用戶。
        //
        // 返回結果:
        //     用戶字元串。
        public string Users { get; set; }

        //
        // 摘要:
        //     為操作授權時調用。
        //
        // 參數:
        //   actionContext:
        //     上下文。
        //
        // 異常:
        //   T:System.ArgumentNullException:
        //     上下文參數為 null。
        public override void OnAuthorization(HttpActionContext actionContext);
        //
        // 摘要:
        //     處理授權失敗的請求。
        //
        // 參數:
        //   actionContext:
        //     上下文。
        protected virtual void HandleUnauthorizedRequest(HttpActionContext actionContext);
        //
        // 摘要:
        //     指示指定的控制項是否已獲得授權。
        //
        // 參數:
        //   actionContext:
        //     上下文。
        //
        // 返回結果:
        //     如果控制項已獲得授權,則為 true;否則為 false。
        protected virtual bool IsAuthorized(HttpActionContext actionContext);
    }
}

另一個在System.Web.Mvc命名空間下

#region 程式集 System.Web.Mvc, Version=5.2.3.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// E:\src\packages\Microsoft.AspNet.Mvc.5.2.3\lib\net45\System.Web.Mvc.dll
#endregion

namespace System.Web.Mvc
{
    //
    // 摘要:
    //     指定對控制器或操作方法的訪問只限於滿足授權要求的用戶。
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
    public class AuthorizeAttribute : FilterAttribute, IAuthorizationFilter
    {
        //
        // 摘要:
        //     初始化 System.Web.Mvc.AuthorizeAttribute 類的新實例。
        public AuthorizeAttribute();

        //
        // 摘要:
        //     獲取或設置有權訪問控制器或操作方法的用戶角色。
        //
        // 返回結果:
        //     有權訪問控制器或操作方法的用戶角色。
        public string Roles { get; set; }
        //
        // 摘要:
        //     獲取此特性的唯一標識符。
        //
        // 返回結果:
        //     此特性的唯一標識符。
        public override object TypeId { get; }
        //
        // 摘要:
        //     獲取或設置有權訪問控制器或操作方法的用戶。
        //
        // 返回結果:
        //     有權訪問控制器或操作方法的用戶。
        public string Users { get; set; }

        //
        // 摘要:
        //     在過程請求授權時調用。
        //
        // 參數:
        //   filterContext:
        //     篩選器上下文,它封裝有關使用 System.Web.Mvc.AuthorizeAttribute 的信息。
        //
        // 異常:
        //   T:System.ArgumentNullException:
        //     filterContext 參數為 null。
        public virtual void OnAuthorization(AuthorizationContext filterContext);
        //
        // 摘要:
        //     重寫時,提供一個入口點用於進行自定義授權檢查。
        //
        // 參數:
        //   httpContext:
        //     HTTP 上下文,它封裝有關單個 HTTP 請求的所有 HTTP 特定的信息。
        //
        // 返回結果:
        //     如果用戶已經過授權,則為 true;否則為 false。
        //
        // 異常:
        //   T:System.ArgumentNullException:
        //     httpContext 參數為 null。
        protected virtual bool AuthorizeCore(HttpContextBase httpContext);
        //
        // 摘要:
        //     處理未能授權的 HTTP 請求。
        //
        // 參數:
        //   filterContext:
        //     封裝有關使用 System.Web.Mvc.AuthorizeAttribute 的信息。filterContext 對象包括控制器、HTTP 上下文、請求上下文、操作結果和路由數據。
        protected virtual void HandleUnauthorizedRequest(AuthorizationContext filterContext);
        //
        // 摘要:
        //     在緩存模塊請求授權時調用。
        //
        // 參數:
        //   httpContext:
        //     HTTP 上下文,它封裝有關單個 HTTP 請求的所有 HTTP 特定的信息。
        //
        // 返回結果:
        //     對驗證狀態的引用。
        //
        // 異常:
        //   T:System.ArgumentNullException:
        //     httpContext 參數為 null。
        protected virtual HttpValidationStatus OnCacheAuthorization(HttpContextBase httpContext);
    }
}

兩者主要區別在於:

  • System.Web.Http 這個主要是用在Web Api
  • System.Web.Mvc 這個主要用在 ASP.NET MVC
  • System.Web.Http 版本中,傳入參數為HttpActionContext
    public override void OnAuthorization(HttpActionContext actionContext);

    System.Web.Mvc版本中,傳入參數為AuthorizationContext

    public virtual void OnAuthorization(AuthorizationContext filterContext);

看似相同,但是在處理自定義許可權的時候,兩者思路相近實際實現方式上有很大的差別。

 

下麵列出兩種屬性下獲取Cookie的不同:

MVC:

public class Foo : AuthorizeAttribute
{
     public override void OnAuthorization(AuthorizationContext filterContext) 
     {
          HttpCookie cookie = filterContext.HttpContext.Request.Cookies.Get("Bar");    
     }
}

 

HTTP(Web Api):

public class Foo : AuthorizeAttribute
{

      public override void OnAuthorization(HttpActionContext actionContext)
      {
           var cookies = actionContext.Request.Headers.GetCookies("Bar").FirstOrDefault();

           var cookie = cookies["Bar"];
      }
}

 

還有就是自定義許可權處理的時候,寫法也不盡相同,後續文章會進行介紹


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

-Advertisement-
Play Games
更多相關文章
  • 1.新建一個web頁。 2.添加引用,引入htmlagilitypack。 3.代碼 HtmlWeb類是一個從網路上獲取一個HTML文檔的類,其提供的功能大多是基於完成此需求出發。 HtmlDocument類對應著一個HTML文檔代碼。它提供了創建文檔,裝載文檔,修改文檔等等一系列功能。 ...
  • 簡介 SQL註入攻擊指的是通過構建特殊的輸入作為參數傳入Web應用程式,而這些輸入大都是SQL語法里的一些組合,通過執行SQL語句進而執行攻擊者所要的操作,其主要原因是程式沒有細緻地過濾用戶輸入的數據,致使非法數據侵入系統。 根據相關技術原理,SQL註入可以分為平臺層註入和代碼層註入。前者由不安全的 ...
  • 一般一個項目開始之前都會有啟動會,需求交底等等,其中會有一個環節,大講特講項目的意義,然後取一個高大上的項目名字,咱這是一個小功能談不上項目,但是名字不能太小氣了。好吧,就叫Trump吧。沒有任何含義,玩嘛! 項目分層結構也要在這裡說一下,這次這個小功能仿照DDD的分層模式,一定記住我說的是仿照。因... ...
  • 簡介 過多發佈的內容相對比較簡單,因此,我只打算把原文中的一些關鍵信息翻譯一下。原文鏈接如下: http://www.asp.net/mvc/overview/getting-started/getting-started-with-ef-using-mvc/implementing-basic-c ...
  • 簡介 那些通過請求(如查詢字元串和表單數據)指定重定向URL的Web程式可能會被篡改,而把用戶重定向到外部的惡意URL。這種篡改就被稱為開發重定向攻擊。 場景分析 假設有一個正規網站http://nerddinner.com/,還有一個惡意網站或釣魚網站http://nerddiner.com/(註 ...
  • 簡介 CSRF(Cross-site request forgery跨站請求偽造,也被稱為“One Click Attack”或者Session Riding,通常縮寫為CSRF或者XSRF,是一種對網站的惡意利用。儘管聽起來像跨站腳本(XSS),但它與XSS非常不同,並且攻擊方式幾乎相左。XSS利 ...
  • 在多線程環境下,使用BlockingCollection以及ConcurrentQueue來消費生產者生產的資源,這是我自己寫的多生產者多消費者的作法,其實也是基於單個task下的阻塞隊列的IsComplete來識別的。 使用阻塞隊列更簡單但是內部的消費者線程比較適合使用單獨的線程不適合使用線程池, ...
  • 因為要部署項目到雲伺服器,不想在伺服器上裝SqlServer,所以需要把項目改為Mysql。 項目初始化 1、下載項目壓縮包,前面文章已經說到,可以加群到群文件里下載。解壓縮下載的項目源碼,使用VS2015打開項目 這裡需要還原包,選擇解決方案 右鍵(還原NuGet包),現在還原NuGet包比之前快 ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...