IdentityServer4實(shí)現(xiàn).Net Core API接口權(quán)限認(rèn)證(快速入門)
什么是IdentityServer4
官方解釋:IdentityServer4是基于ASP.NET Core實(shí)現(xiàn)的認(rèn)證和授權(quán)框架,是對OpenID Connect和OAuth 2.0協(xié)議的實(shí)現(xiàn)。
通俗來講,就是服務(wù)端對需要認(rèn)證授權(quán)的資源(客戶端請求資源)在外層使用IdentityServer4框架進(jìn)行封裝加殼,用戶只能通過獲取IdentityServer4頒發(fā)的Token令牌才能進(jìn)行資源訪問。
下面開始進(jìn)入正題,如何快速搭建實(shí)現(xiàn)API接口鑒權(quán)。
準(zhǔn)備:1.下載準(zhǔn)備NetCore sdk環(huán)境
2.本文開發(fā)環(huán)境為VS2019,部分代碼可能和之前的版本不同。
第一步,新建權(quán)限認(rèn)證服務(wù)項(xiàng)目,本文以Net Core API項(xiàng)目模板為例(也可以選擇其他模板)

第二步,添加IdentityServer4 Nuget程序包。不同版本依賴的NetCoe sdk環(huán)境不同,需手動選擇合適版本。

這里提醒一下,有些同學(xué)的系統(tǒng)可能添加Nuget程序包時,發(fā)現(xiàn)無法找到程序包。我們這里找出了解決方法,點(diǎn)擊Nuget程序包添加頁面的右上角設(shè)置按鈕,看到如下頁面,手動添加如下的nuget.org,然后重新搜索即可。

第三步,添加IdentityServer4配置管理類。本文以用戶密碼授權(quán)模式為例。
public class Config
{
/// <summary>
/// 定義資源范圍
/// </summary>
public static IEnumerable<ApiResource> GetApiResources()
{
return new List<ApiResource>
{
new ApiResource("api1", "我的第一個API")
};
}
/// <summary>
/// 定義訪問的資源客戶端
/// </summary>
/// <returns></returns>
public static IEnumerable<Client> GetClients()
{
return new List<Client>
{
new Client{
ClientId="client",//定義客戶端ID
ClientSecrets=
{
new Secret("secret".Sha256())//定義客戶端秘鑰
},
AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,//授權(quán)方式為用戶密碼模式授權(quán),類型可參考GrantTypes枚舉
AllowedScopes={ "api1"}//允許客戶端訪問的范圍
}
};
}
/// <summary>
/// 這個方法是來規(guī)范tooken生成的規(guī)則和方法的。一般不進(jìn)行設(shè)置,直接采用默認(rèn)的即可。
/// </summary>
/// <returns></returns>
public static IEnumerable<IdentityResource> GetIdentityResources()
{
return new IdentityResource[]
{
new IdentityResources.OpenId()
};
}
}
第四步,Startup啟動類中注冊服務(wù)中間件
// This method gets called by the runtime. Use this method to add services to the container.
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()//注冊服務(wù)
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())//配置類定義的授權(quán)范圍
.AddInMemoryClients(Config.GetClients())//配置類定義的授權(quán)客戶端
.AddTestUsers(new List<TestUser> { new TestUser { Username = "Admin", Password = "123456", SubjectId = "001", IsActive = true } });//模擬測試用戶,這里偷懶了,用戶可以單獨(dú)管理,最好不要直接在這里New
services.AddControllers();
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseIdentityServer();//添加中間件
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
應(yīng)用程序默認(rèn)的端口號有兩種:1.http://localhost:5000 2.https://localhost:5001.
到這里,Identityserver4鑒權(quán)服務(wù)已經(jīng)簡單搭建完成。我們直接在VS中啟動項(xiàng)目。并在端口號后面加上/.well-known/openid-configuration,出現(xiàn)如下頁面則表示配置成功。

第五步,PostMan模擬請求獲取token(當(dāng)然這一步非必須,對postman感興趣的同學(xué)可以試一試)
我們都知道IdentityServer4需要客戶端先訪問鑒權(quán)服務(wù)獲取token令牌,才能進(jìn)一步訪問加權(quán)的服務(wù)器資源。我們這里先通過PostMan模擬客戶端請求,獲取Token。(postman工具大家可以網(wǎng)上下載,也可以使用谷歌自帶的postman插件)
1.使用postman請求token時,有個地方需要注意下:
很多同學(xué)在使用https請求時,即請求https://localhost:5001,會發(fā)現(xiàn)無法成功。因?yàn)閜ostman默認(rèn)把SSL證書認(rèn)證打開了,我們可以手動關(guān)閉掉。找到postman頁面右上方的小扳手圖標(biāo),進(jìn)入設(shè)置頁面找到ssl關(guān)掉即可。當(dāng)然同學(xué)們直接使用http://localhost:5000請求就無需設(shè)置SSL.

2.請求參數(shù)
這里的參數(shù)value就是我們在鑒權(quán)服務(wù)配置類設(shè)置的client和TestUser信息。
Grant_Type為授權(quán)類型,本文我們使用的是用戶密碼模式,所以這里填password.

這里我們看到,我們已成功模擬請求獲取了Token。大功告成,鑒權(quán)服務(wù)已驗(yàn)證可用,我們趕緊去發(fā)布部署吧。
第六步,鑒權(quán)服務(wù)發(fā)布部署。
.Net Core發(fā)布模式有三種:
1.框架依賴+可移植
2.框架依賴+運(yùn)行時環(huán)境(帶可執(zhí)行程序exe)
3.獨(dú)立部署
簡單來說,框架依賴模式發(fā)布的程序包,都需要部署環(huán)境自帶.net core等運(yùn)行環(huán)境;而獨(dú)立部署則不需要考慮,發(fā)布包已經(jīng)包含了運(yùn)行環(huán)境,直接部署即可。
下面本文以框架依賴+可移植發(fā)布,做簡單介紹。

發(fā)布完成后,我們會在發(fā)布路徑中看到程序dll.我們找到發(fā)布路徑,通過CMD命令窗口:dotnet xxx.dll可直接啟動。

如上,則表示啟動成功。(如果其他發(fā)布模式,直接雙擊發(fā)布包中可執(zhí)行exe文件即可啟動)
鑒權(quán)服務(wù)部署完成后,我們API接口如何使用呢,下面開始正式介紹。
第一步:新建Web Api項(xiàng)目

添加Nuget程序包

第二步:配置啟動類
public void ConfigureServices(IServiceCollection services)
{
//注冊服務(wù)
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(x =>
{
x.Authority = "http://localhost:5000";//鑒權(quán)服務(wù)地址
x.RequireHttpsMetadata = false;
x.ApiName = "api1";//鑒權(quán)范圍
});
services.AddControllers();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();//添加鑒權(quán)認(rèn)證
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
應(yīng)用程序默認(rèn)的端口號有兩種:1.http://localhost:5000 2.https://localhost:5001.為了避免端口號沖突被占用,我們可以在Program類中修改應(yīng)用程序啟動端口號。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseUrls("http://*:5555");//設(shè)置啟動端口號
webBuilder.UseStartup<Startup>();
});
第三步:創(chuàng)建API DEMO
[Route("api/[controller]")]
[ApiController]
public class TestController : ControllerBase
{
// GET: api/Test
/// <summary>
/// 方法加權(quán)
/// </summary>
/// <returns></returns>
[Authorize]
[HttpGet]
public IEnumerable<string> Get()
{
return new string[] { "value1", "value2" };
}
/// <summary>
/// 方法未加權(quán) 可直接訪問
/// </summary>
/// <param name="id"></param>
/// <returns></returns>
// GET: api/Test/5
[HttpGet("{id}", Name = "Get")]
public string Get(int id)
{
return "value";
}
/// <summary>
/// 開放獲取token API 接口
/// </summary>
/// <returns></returns>
[HttpGet("GetToken")]
public async Task<string> GetToken()
{
var client = new HttpClient();
var tokenResponse = await client.RequestPasswordTokenAsync(new PasswordTokenRequest
{
Address = "http://localhost:5000/connect/token",
ClientId = "client",
ClientSecret = "secret",
Scope = "api1",
UserName = "Admin",
Password = "123456",
});
if (tokenResponse.IsError)
{
return tokenResponse.Error;
}
return tokenResponse.AccessToken;
}
}
1.接口方法上加上:
[Authorize]
相當(dāng)于對接口加權(quán),只有被授權(quán)的用戶才能訪問(即獲取token的用戶)。此時上文中接口api/Test由于被加權(quán),請求時會報錯;但是api/Test/1接口未加權(quán),仍可正常請求。
那么我們?nèi)绾尾拍茉L問被加權(quán)的接口呢???Go Next
2.我們這里開放了獲取Token的接口GetToken(類似于上文中通過PostMan獲取Token)
訪問被加權(quán)的API接口,我們這里需要先請求獲取Token,然后請求加權(quán)接口時帶上token參數(shù)。

3.請求加權(quán)接口

請求加權(quán)接口時帶上Token,接口請求成功!
OK,關(guān)于如何快速開發(fā)和調(diào)試基于IdentityServer4框架的API接口鑒權(quán)服務(wù),至此我們已介紹完畢。
小弟不才,本文中有考慮不周全或錯誤的地方,歡迎大家指正。
(如果有的同學(xué)想通過IIS部署API應(yīng)用程序,這里有個地方需要注意下,需要在IIS(功能視圖——模塊)中添加AspNetCoreModule模塊。具體原因本文就不在這里介紹了。)
到此這篇關(guān)于IdentityServer4實(shí)現(xiàn).Net Core API接口權(quán)限認(rèn)證(快速入門)的文章就介紹到這了,更多相關(guān).Net Core API權(quán)限認(rèn)證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
uni-app結(jié)合.NET?7實(shí)現(xiàn)微信小程序訂閱消息推送
本文主要介紹了uni-app結(jié)合.NET?7實(shí)現(xiàn)微信小程序訂閱消息推送,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-02-02
.Net項(xiàng)目在Docker容器中開發(fā)部署
這篇文章介紹了.Net項(xiàng)目在Docker容器中開發(fā)部署的方法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-04-04
asp.net EXECUTENONQUERY()返回值介紹
前些日子作一些數(shù)據(jù)項(xiàng)目的時候 在ADO.NET 中處理 ExecuteNonQuery()方法時,總是通過判斷其返回值是否大于0來判斷操作時候成功 。但是實(shí)際上并不是這樣的,下面詳細(xì)介紹一下,有需要的朋友可以參考2013-08-08
此頁的狀態(tài)信息無效,可能已損壞 的處理辦法及原因分析
此頁的狀態(tài)信息無效,可能已損壞 的處理辦法及原因分析,需要的朋友可以參考一下2013-06-06
使用.NET Core實(shí)現(xiàn)餓了嗎拆紅包功能
這篇文章主要介紹了使用.NET Core實(shí)現(xiàn)餓了嗎拆紅包功能,本文給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下2019-07-07
.NET下為百度文本編輯器UEditor增加圖片刪除功能示例
今天下載了目前最新版1.2.5為版本看更新記錄,主要是對表格做個修改,我下載用上,上傳圖片的刪除功能給取消了,下面與大家分享下增加圖片刪除功能示例2013-05-05
ASPX向ASCX傳值以及文本創(chuàng)建圖片(附源碼)
把用戶在TextBox輸入的文字創(chuàng)建為一個圖片,ASCX的ImageButton的ImageUrl重新指向這剛產(chǎn)生的圖片,接下來介紹下ASPX向ASCX傳值,感興趣的朋友可以參考下哈2013-03-03

