亚洲欧洲视频,三男玩一女摸吃奶,久久久久久久片,精品中文一区二区三区,美女在线国产,国产有码视频,亚洲激情五月

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

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

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

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

基本概念:    

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

總共有三個(gè)API資源,分別是:


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

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

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

IdentityServer:認(rèn)證服務(wù)器,由IdentityServer4生成,需要引入IdentityServer4資源包,在用到的時(shí)候我們?cè)僬f(shuō)。

客戶端:即,訪問(wèn)我們API資源的程序,今天的客戶端是由一個(gè)叫client.exe的程序來(lái)扮演的,如果精力與時(shí)間允許,我們后面再搞手機(jī)APP的。

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

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

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

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

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

OK,起床后接著寫(xiě)。

我們?cè)陔娔X上建立以下目錄D:\WEB\ID4\APITEST

選擇WEB API

指定工作目錄

選擇6.0版本

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

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

我們?cè)囍{(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,并未在上面界面顯示出來(lái)。說(shuō)明我們的接口做好了。接下來(lái),除了天氣預(yù)報(bào),我們?cè)偌觾蓚€(gè)測(cè)試接口進(jìn)去,一個(gè)是官方的Identity,一個(gè)是我們自己寫(xiě)的測(cè)試接口Students,多放幾個(gè)接口是為了測(cè)試我們的權(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[]
        {
        "中國(guó)", "美國(guó)", "新加坡", "英國(guó)", "加拿大", "新西蘭", "日本", "瑞士", "挪威", "斯里蘭卡"
        };


        [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)
            }) ;
        }
    }
}

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

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

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


報(bào)了500錯(cuò)誤,

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ù)器錯(cuò)誤,也就是說(shuō)你的代碼是有問(wèn)題的。為什么會(huì)報(bào)這個(gè)問(wèn)題呢?從提示看,很明顯。這是因?yàn)槲覀兊慕涌谠L問(wèn)需要身份驗(yàn)證才可以,而我們卻沒(méi)有給服務(wù)器指定身份驗(yàn)證方式。慶幸的一點(diǎn)是我們的IDS4與JWT是兼容的,這樣給我們代碼的移植帶來(lái)很大方便,我們現(xiàn)在來(lái)指定API資源服務(wù)器JWT的身份驗(yàn)證方式,打開(kāi)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)功能開(kāi)啟。因?yàn)槿鄙俦匾囊冒?,所以?xiàng)目并不能啟動(dòng),我們把它引進(jìn)來(lái)。


搜索

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



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

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


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


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


下拉加載更多評(píng)論
最新評(píng)論
暫無(wú)!