ASP.NET OAuth 2.0 新手上路

来源:https://www.cnblogs.com/xiaobai123/archive/2018/07/21/9348074.html
-Advertisement-
Play Games

OAuth2.0資料 初衷:一直想整理授權系列demo,讓自己項目高端大尚,列出新手授權系列,幫助小白程式員不用在為授權頭疼 OAuth 允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的 2 ...


OAuth2.0資料

初衷:一直想整理授權系列demo,讓自己項目高端大尚,列出新手授權系列,幫助小白程式員不用在為授權頭疼      

        OAuth 允許用戶提供一個令牌,而不是用戶名和密碼來訪問他們存放在特定服務提供者的數據。每一個令牌授權一個特定的網站(例如,視頻編輯網站)在特定的時段(例如,接下來的 2 小時內)內訪問特定的資源(例如僅僅是某一相冊中的視頻)。這樣,OAuth 讓用戶可以授權第三方網站訪問他們存儲在另外服務提供者的某些特定信息,而非所有內容。

以上概念來自:https://zh.wikipedia.org/wiki/OAuth

詳細理論知識,參考文章如下文章,本文章重在實踐

1.http://www.cnblogs.com/lanxiaoke/p/6358332.html

2.https://www.cnblogs.com/selimsong/p/8037717.html

3.http://www.cnblogs.com/xishuai/p/aspnet-webapi-owin-oauth2.html

項目實踐開發

步驟1和步驟2都行,看官樂意就行

步驟1

通過NuGet安裝

Microsoft.Owin.Security.OAuth

Owin Microsoft.Owin.Host.SystemWeb(重點)

步驟2

Owin Microsoft.Owin.Host.SystemWeb(重點)

Microsoft.Owin.Security.OAuth

Microsoft.Owin.Security.Cookies(可忽略)

Microsoft.AspNet.Identity.Owin

重點在於步驟1少了一個核心dll,少了這個核心dll無法啟動部署owin

新增Startup.cs

[assembly: OwinStartup(typeof(OAuth2.Startup))]
namespace OAuth2
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }
    }
}

Owin Microsoft.Owin.Host.SystemWeb 通過這個dll,程式啟動時候註冊,如果不引用,該方法不會生效,看官可以打個斷點試一試

新增Startup.Auth.cs

namespace OAuth2
{
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
            {
                //從url中獲取token,相容hearder方式
                //Provider = new QueryStringOAuthBearerProvider("access_token")
            });
            var OAuthOptions = new OAuthAuthorizationServerOptions
            {
                AllowInsecureHttp = true,
                TokenEndpointPath = new PathString("/token"), //獲取 access_token 認證服務請求地址
                AuthorizeEndpointPath = new PathString("/authorize"), //獲取 authorization_code 認證服務請求地址
                AccessTokenExpireTimeSpan = TimeSpan.FromSeconds(3600), //access_token 過期時間

                Provider = new OpenAuthorizationServerProvider(), //access_token 相關認證服務
                AuthorizationCodeProvider = new OpenAuthorizationCodeProvider(), //authorization_code 認證服務
                RefreshTokenProvider = new OpenRefreshTokenProvider() //refresh_token 認證服務
            };

            app.UseOAuthBearerTokens(OAuthOptions); //表示 token_type 使用 bearer 方式



        }
    }

    public class QueryStringOAuthBearerProvider : OAuthBearerAuthenticationProvider
    {
        readonly string _name;

        public QueryStringOAuthBearerProvider(string name)
        {
            _name = name;
        }

        public override Task RequestToken(OAuthRequestTokenContext context)
        {
            var value = context.Request.Query.Get(_name);

            if (!string.IsNullOrEmpty(value))
            {
                context.Token = value;
            }

            return Task.FromResult<object>(null);
        }
    }

}

眼光犀利的同學肯定註意到這兩個類名相同,命名空間也相同,為什麼沒有報錯  請註意關鍵字 partial 

OpenAuthorizationServerProvider示例代碼  詳細見demo,只提代碼需要註意地方

        /// <summary>
        /// 驗證 client 信息
        /// </summary>
        public override async Task ValidateClientAuthentication(OAuthValidateClientAuthenticationContext context)
        {
            string clientId;
            string clientSecret;
            if (!context.TryGetBasicCredentials(out clientId, out clientSecret))
            {
                context.TryGetFormCredentials(out clientId, out clientSecret);
            }

            if (clientId != "xishuai" || clientSecret != "123")
            {
                context.SetError("invalid_client", "client or clientSecret is not valid");
                return;
            }
            context.Validated();
        }

        public string BaseString()
        {
            string clientId = "xishuai";
            string clientSecret = "123";
            return Convert.ToBase64String(Encoding.ASCII.GetBytes(clientId + ":" + clientSecret));
        }
驗證生效如圖 按照如下格式 key:value,然後base64編碼 
context.TryGetBasicCredentials 否則解析不了 驗證不通過

OpenAuthorizationCodeProvider示例代碼 詳細見demo

OpenRefreshTokenProvider 示例代碼 詳細見demo

新增ValueController.cs

public class ValueController : ApiController
    {
        // GET api/values  access_token驗證才能訪問
        [Authorize]
        [HttpGet]
        public IEnumerable<string> Index()
        {
            return new string[] { "value1", "value2" };
        }
        
//獲取授權code [HttpGet] [Route(
"api/authorization_code")] public HttpResponseMessage Get(string code) { return new HttpResponseMessage() { Content = new StringContent(code, Encoding.UTF8, "text/plain") }; } }

新增OAuthon2Controller.cs

    public class OAuthon2Controller : Controller
    {
        //根據你項目埠
        private const string HOST_ADDRESS = "http://localhost:60903";

        // GET: OAuthon2   直接獲取授權code鏈接,方便獲取code
        public string Index()
        {
            string clientId = "xishuai";
            string url = $"{HOST_ADDRESS}/authorize?grant_type=authorization_code&response_type=code&client_id={clientId}&redirect_uri={HttpUtility.UrlEncode($"{HOST_ADDRESS}/api/authorization_code")}";
            return url;
        }

    }

根據獲取的url,   在將紅色部分url複製出來到瀏覽器中可以獲取到code

現在code有了  將獲取access_token

1

grant_type:authorization_code

code:圖上紅色url返回給你的

client_id:xishuai 可以理解為appid  自定義,因為代碼中固定了,你可以改

redirect_uri:這個鏈接你也能改的,接受code 在ValueController.cs   (action:api/authorization_code)

http://localhost:60903/api/authorization_code

這個地方需要註意  需要和你獲取code redirect_uri保持一致就行

string url = $"{HOST_ADDRESS}/authorize?grant_type=authorization_code&response_type=code&client_id={clientId}&redirect_uri={HttpUtility.UrlEncode($"{HOST_ADDRESS}/api/authorization_code")}";

然後你就拿到access_token 去調用 api/Value/Index

2

如果這個地方你輸入錯,會獲取失敗

Authorization     Bearer後面空格 在輸入access_token 

源碼下載


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

-Advertisement-
Play Games
更多相關文章
  • 今天和大家聊聊golang中怎麼使用rpc,rpc數據傳輸會涉及到gob編碼,所以先講講gob,別擔心,就算你完全沒有接觸過gob與rpc,只要知道rpc的中文是遠程過程調用,剩下的我都能給你講明白(帶你入門不包你精通)! 一、數據結構編碼之gob gob全稱為:Go binary Golang自帶 ...
  • Mysqli面向對象操作資料庫 首先配置一下資料庫: 接著用PHP中的Mysqli擴展庫面向對象查詢這個數據表。 操作分為以下幾個步驟: 連接資料庫 操作資料庫 處理結果 關閉資源 query($sql); //查詢語句返回結果集 while($row=$result fetch_row()){ f ...
  • 1、JDBC:JDBA是Java資料庫連接(Java DataBase Connectivity)技術的簡稱,提供連接各種常用資料庫的能力; ●Java是通過JDBC技術實現對各種資料庫訪問的, ●JDBA是Java資料庫連接(Java DataBase Connectivity)技術的簡稱,他充當 ...
  • 1. 什麼是函數 2. 函數的定義及調用 進群:125240963 即可獲取數十套PDF哦! 2.1 定義函數 函數定義規則如下: 2.2 函數中的參數 參數的作用 函數,把具有獨立功能的代碼塊組織成為一個小模塊,在需要的時候調用 函數的參數,增加函數的通用性,針對相同的數據處理邏輯,能夠適應更多的 ...
  • "DotNet菜園" 占個位置 ...
  • 0.使用說明 AliDDNSNet 是基於 .NET Core 開發的動態 DNS 解析工具,藉助於阿裡雲的 DNS API 來實現功能變數名稱與動態 IP 的綁定功能。 使用時請更改同目錄下的 為 文件,同時也可以顯示通過 參數來制定配置文件路徑。例如: 1.配置說明: 通過更改 / 的內容來實現 DDN ...
  • 本文沒啥技術含量,就是測試一下 MSSqlHelper 在 使用反射、不使用反射 的性能對比。 之後,不要問為什麼不用 ORM 這類的東西 —— 會有另外的文章 介紹 自己這些年 自己的ORM 升級歷史。 背景: 我自己有一個 MSSqlHelper, 這個 輔助類 是最基本的一個 資料庫操作類。 ...
  • mysql-connector-net-8.0.11.msi 可以從mysql官網下載 如果使用ado.net鏈接mysql資料庫則只需要引用 MySql.Data.dll即可,並不需要安裝mysql-connector-net驅動程式; 如果使用EF的話需要安裝mysql-connector-ne ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...