一区在线电影,国产在线首页,中文字幕精,天天爽天天射,夜色99,日韩国产成人av,伊人久久综合视频

威勢網(wǎng)絡(luò),為您的企業(yè)和團隊注入互聯(lián)網(wǎng)活力!
服務(wù)熱線:138-9741-0341

[原創(chuàng)] IdentityServer4權(quán)限控制---客戶端授權(quán)模式之API服務(wù)器搭建(一)

發(fā)布日期:2022/9/3 作者: 瀏覽:945

    今天簡單的研究了一下IdentityServer4授權(quán)模式,官網(wǎng)地址在這里,有興趣的朋友看官網(wǎng),要比我講的好多了。由于官網(wǎng)是英文的,看起來傷眼眼,又費時間,(其實最重要的是我英文水平不行)所以在這里,我嘗試用國人容易理解的方式簡單描述一下測試過程。在開始之前,我們先了解幾個基本概念及今天的主要實驗?zāi)康摹?

基本概念:    

API資源:即,受保護的API資源,在這里主要是一臺服務(wù)器的API資源,如下圖所示:

總共有三個API資源,分別是:


https://localhost:6001/identity
https://localhost:6001/api/Students
https://localhost:6001/WeatherForecast

簡單說明一下,第一個API成功訪問后返回的是當(dāng)前用戶的一些基礎(chǔ)信息,是官網(wǎng)的DEMO。第二個是我寫的一個測試接口,成功調(diào)用后會隨機返回5個學(xué)生信息,第三個是VS模板生成的天氣預(yù)報接口。今天我們就拿這三個接口開刀。

對了,差點跑題了,我們接著上面的話題繼續(xù)解釋一下基本概念。

IdentityServer:認(rèn)證服務(wù)器,由IdentityServer4生成,需要引入IdentityServer4資源包,在用到的時候我們再說。

客戶端:即,訪問我們API資源的程序,今天的客戶端是由一個叫client.exe的程序來扮演的,如果精力與時間允許,我們后面再搞手機APP的。

另外,再講兩個稍微洋氣一點的名字,Authentication,Authorization。注意看,兩個拼寫是不同的,一個是用來驗證你的TOKEN有沒有符合規(guī)則的,也就是檢查權(quán)限的,一個是用來授權(quán)的,大家簡單理解一下即可,對了,還有一個概念,TOKEN。也就是我們說的令牌,這是干嗎的?

舉個例子,公司派你去出差,對方公司不認(rèn)識你,所以公司就給你開了一份介紹信,信上面寫了你的名字,年齡,性別,公司等一些信息,用來給對方接待人員看的,但是這些信息別人也可以偽造,怎么區(qū)分真假呢?所以公司給你的介紹信上加蓋了一個公章,只要對方接待人員拿你介紹信的公章到公商部門一核實,如果沒有問題,說明你的信息是可靠的,這個TOKEN簡單理解一下,就和這張介紹信一樣。那公商部門又怎么知道這公章是真的還是假的呢?這個過程叫鑒權(quán),其實就是通過加密算法,把你上面的信息(身份證,姓名,年齡,性別...)按一定算法加密,加密過程中有一個極為重要的私鑰參與了計算,一般人接觸不到,只有工商才能接觸到,加密完了以后再和你介紹信上的密串對比,如果一致,說明信息是真的。好了,啰嗦的太多了,差點又跑題了,希望把問題說清楚了。

接下來再說說我們的實驗?zāi)康摹<僭O(shè)我們上面的三個API,天氣預(yù)報是匿名可訪問的,學(xué)生是登錄用戶可訪問的,Identity是只有管理員才可以訪問的,這樣我們也就達到了對接口資源進行保護的目的,本次實驗的目的算是交待完了?,F(xiàn)在我們就著手去做。

本教程算是菜鳥教程了,我想寫的盡量簡單一點,首先,我們先來看看如何實現(xiàn)一個API資源站點,快速的做法是去下載官網(wǎng)的DEMO,但是我下下來以后可能是因為版本的問題,盡然報錯不能運行,所以干脆自己建一個,反正是為了測試目的,這不是重點,建議朋友們和我一樣自己建吧!這樣還可以體驗DIY的快樂,并且,我們自己寫一些自己的權(quán)限策略上去,快樂更多!

未完待續(xù),先睡覺...

OK,起床后接著寫。

我們在電腦上建立以下目錄D:\WEB\ID4\APITEST

選擇WEB API

指定工作目錄

選擇6.0版本

按照向?qū)б徊讲较聛?,我們的API接口就做好了,如下圖所示

打開上面的JSON文件,把啟動端口改成6001,以和試驗環(huán)境以及官網(wǎng)同步,然后啟動測試一下,已經(jīng)沒問題了,如下圖所示:

我們試著調(diào)用以下API,返回以下代碼:


[
  {
    "date": "2022-09-04T11:47:40.9032622+08:00",
    "temperatureC": -9,
    "temperatureF": 16,
    "summary": "Balmy"
  },
  {
    "date": "2022-09-05T11:47:40.9042275+08:00",
    "temperatureC": 49,
    "temperatureF": 120,
    "summary": "Chilly"
  },
  {
    "date": "2022-09-06T11:47:40.9042304+08:00",
    "temperatureC": 40,
    "temperatureF": 103,
    "summary": "Sweltering"
  },
  {
    "date": "2022-09-07T11:47:40.9042306+08:00",
    "temperatureC": 4,
    "temperatureF": 39,
    "summary": "Warm"
  },
  {
    "date": "2022-09-08T11:47:40.9042308+08:00",
    "temperatureC": -11,
    "temperatureF": 13,
    "summary": "Sweltering"
  }
]
注意,狀態(tài)碼200,并未在上面界面顯示出來。說明我們的接口做好了。接下來,除了天氣預(yù)報,我們再加兩個測試接口進去,一個是官方的Identity,一個是我們自己寫的測試接口Students,多放幾個接口是為了測試我們的權(quán)限。


代碼分別如下:


using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Mvc;
using System.Linq;

namespace APITEST.Controllers
{
    [Route("identity")]
    [Authorize]
    public class IdentityController : ControllerBase
    {
        [HttpGet()]
        public IActionResult Get()
        {
            return new JsonResult(from c in User.Claims select new { c.Type, c.Value });
        }
    }
}
namespace APITEST
{
    public class Student
    {
        public int BoinYear { get; set; }

        public string XingMing { get; set; }

        public int Age => System.DateTime.Now.Year- BoinYear;

        public string? Address { get; set; }
    }
}
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;

namespace APITEST.Controllers
{
    [Route("api/[controller]")]
    [ApiController]
    public class StudentsController : ControllerBase
    {
        private static readonly string[] Students = new[]
        {
        "TOM", "Jack", "Aimily", "Alice", "Black Smith", "John", "QiQi", "莫言", "王朔", "易中天"
        };
        private static readonly string[] Address = new[]
        {
        "中國", "美國", "新加坡", "英國", "加拿大", "新西蘭", "日本", "瑞士", "挪威", "斯里蘭卡"
        };


        [HttpGet(Name = "GetStudents")]
        public IEnumerable<Student> Get()
        {
            Random rnd = new Random();
            return Enumerable.Range(1, 5).Select(index => new Student
            {
                XingMing = Students[rnd.Next(Students.Length)],
                Address = Address[rnd.Next(Address.Length)],
                BoinYear=rnd.Next(1950,1990)
            }) ;
        }
    }
}

把它們加到項目中去,文件目錄結(jié)構(gòu)及運行后顯示效果如下:

這樣我們?nèi)齻€接口就做好了,注意我們的Identity接口,前面加了

  [Route("identity")]
    [Authorize]
第一行是API路由地址,第二行是集成的微軟的身份驗證,它代表只有經(jīng)過身份驗證的用戶才可以訪問,我們試著在頁面上調(diào)用一下試試:


報了500錯誤,

System.InvalidOperationException: No authenticationScheme was specified, and there was no DefaultChallengeScheme found. The default schemes can be set using either AddAuthentication(string defaultScheme) or AddAuthentication(Action<AuthenticationOptions> configureOptions).
   at Microsoft.AspNetCore.Authentication.AuthenticationService.ChallengeAsync(HttpContext context, String scheme, AuthenticationProperties properties)
   at Microsoft.AspNetCore.Authorization.Policy.AuthorizationMiddlewareResultHandler.HandleAsync(RequestDelegate next, HttpContext context, AuthorizationPolicy policy, PolicyAuthorizationResult authorizeResult)
   at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
   at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
   at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
   at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

HEADERS
=======
Accept: */*
Host: localhost:6001
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/104.0.0.0 Safari/537.36
:method: GET
Accept-Encoding: gzip, deflate, br
Accept-Language: zh-CN,zh;q=0.9,en;q=0.8
Referer: https://localhost:6001/swagger/index.html
sec-ch-ua: "Chromium";v="104", " Not A;Brand";v="99", "Google Chrome";v="104"
sec-ch-ua-mobile: ?0
sec-ch-ua-platform: "Windows"
sec-fetch-site: same-origin
sec-fetch-mode: cors
sec-fetch-dest: empty
500就是服務(wù)器錯誤,也就是說你的代碼是有問題的。為什么會報這個問題呢?從提示看,很明顯。這是因為我們的接口訪問需要身份驗證才可以,而我們卻沒有給服務(wù)器指定身份驗證方式。慶幸的一點是我們的IDS4與JWT是兼容的,這樣給我們代碼的移植帶來很大方便,我們現(xiàn)在來指定API資源服務(wù)器JWT的身份驗證方式,打開program.cs,加入以下代碼:



builder.Services.AddAuthentication("Bearer")
    .AddJwtBearer("Bearer", options =>
    {
        options.Authority = "https://localhost:5001";//認(rèn)證服務(wù)器

        options.TokenValidationParameters = new TokenValidationParameters
        {
            ValidateAudience = false
        };
    });


然后在下面繼續(xù)加入


app.UseAuthentication();
app.UseAuthorization();
這樣才能讓鑒權(quán)功能開啟。因為缺少必要的引用包,所以項目并不能啟動,我們把它引進來。


搜索

Microsoft.AspNetCore.Authentication.JwtBearer
把它引進來,我安裝的是6.0.8版本的。然后回到program.cs中去,發(fā)現(xiàn)new TokenValidationParameters有紅色提示,我們把using Microsoft.IdentityModel.Tokens;引進來就可以了。好了,我們再去調(diào)用接口試試,結(jié)果如下:



我們看到了,返回的是401錯誤,也就是說身份驗證被拒絕了,我們再調(diào)用其它兩個接口試試,均可以正常返回調(diào)用結(jié)果,說明我們的JWT身份驗證已經(jīng)做好了。眼細的朋友可能要問了,你那代碼

options.Authority = "https://localhost:5001";//認(rèn)證服務(wù)器
不是還指定了一個驗證服務(wù)器嗎?在哪呢? 是的,JWT驗證真是方便,還可以這樣指定遠程驗證服務(wù)器,不得不說微軟想的也真是周到。我們上面調(diào)用接口都是在未登錄的情況下調(diào)用的,也就是給API服務(wù)器提交的TOKEN為空,這樣服務(wù)器直接就拒絕了??偨Y(jié)一下:到現(xiàn)在為止,我們只是搭建了接口服務(wù)器,也就是資源服務(wù)器,我們對外開放了三個資源接口,我們的目的就是把這三個資源通過身份驗證的手段給它保護起來,請記住我們資源服務(wù)器(API服務(wù)器)的接口地址:https://localhost:6001 因為后面要用到。今天的代碼上傳到這里,有需要的朋友自己下載測試。OK,啰嗦這么多,如果你能堅持看到這里還沒有瞌睡,我們再來看第二篇,如何搭建認(rèn)證服務(wù)器:


[原創(chuàng)] IdentityServer4權(quán)限控制---客戶端授權(quán)模式之IDS4認(rèn)證服務(wù)器搭建(二)


原創(chuàng)文章,轉(zhuǎn)載請注明出處:http://www.maiyt.com/article-27


下拉加載更多評論
最新評論
暫無!