客戶端模式(Client Credentials Grant)是指客戶端直接向認證服務(Authorization Server)發送認證請求,獲取token
,進行認證,通常適用於受信任的客戶端。
java
- 客戶端向認證服務器進行認證,並請求一個訪問令牌
token
;- 認證服務器進行認證,經過以後,返回客戶端一個訪問令牌。
- 建立一個認證服務
IdentityServerCenter
,經過NuGet
安裝IdentityServer4
;- 添加配置資源與客戶端的文件,引入
using IdentityServer4.Models
public class Config {
public static IEnumerable<ApiResource> GetResources() {
return new List<ApiResource> {
new ApiResource {
Name = "ImageResource",
Scopes={ new Scope ("ImageResource")},//Scopes必須配置,不然獲取token時返回 invalid_scope
},
new ApiResource { Name = "FileResourse" },
new ApiResource { Name="Api", Scopes={new Scope ("Api") } }
};
}
public static IEnumerable<Client> GetClients() {
return new List<Client> {
new Client {
ClientId = "ClientId",
AllowedGrantTypes =GrantTypes.ClientCredentials,//受權模式:客戶端模式
AllowedScopes={ "ImageResource","Api" }, //容許訪問的資源 GetResources()中配置的
ClientSecrets={ new Secret { Value= "ClientSecret".Sha256(), Expiration=DateTime.Now.AddMinutes(5)} }
} };
}
}
- 注入
IdentityServer4
,添加IdentityServer4
配置
public void ConfigureServices(IServiceCollection services) {
//注入IdentityServer 添加IdentityServer4配置
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetResources()) //添加配置的資源ApiResource
.AddInMemoryClients(Config.GetClients());//添加配置的客戶端Client
// services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
- 使用
IdentityServer4
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
//使用IdentityServer
app.UseIdentityServer();
}
- 啓動項
因爲未使用MVC
,訪問該api
返回404。IdentityServer4
提供一個地址可獲取相關配置項。
http://examplehostname.com.well-known/openid-configuration/
訪問 http://localhost:5000/.well-known/openid-configuration 將返回的信息序列化以下
api
scopes_supported": ["ImageResource", "Api", "offline_access"]
即爲
Config
中配置的訪問的資源
AllowedScopes
。
- 使用
postman
獲取token
grant_type
爲客戶端受權client_credentials
,client_id
與Client_Secret
爲Config
中配置的ClientId
與Secret
。接下來建立一個可訪問的資源。
- 建立一個資源服務項目
ImageResourceApi
- 注入認證
public void ConfigureServices(IServiceCollection services) {
services.AddAuthentication(config => {
config.DefaultScheme = "Bearer";
}).AddIdentityServerAuthentication(option=> {
option.ApiName = "ImageResource";
option.Authority = "http://localhost:5000"; //認證服務的url
option.ApiSecret = "ClientSecret".ToSha256();// 訪問的secret
option.RequireHttpsMetadata = false;
});
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env) {
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseHsts();
}
app.UseHttpsRedirection();
//使用認證
app.UseAuthentication();
app.UseMvc();
}
- 啓動資源服務,返回401未受權;
- 使用
postman
帶着token
請求資源服務ImageResourceApi
,請求成功。