初探IdentityServer4(客户端模式)
共 3077字,需浏览 7分钟
·
2022-01-05 18:21
Oatuth2协议的客户端模式介绍
Client Credentials Grant (客户端模式)是Oauth2.0协议中,四种模式自建单的一种。它由两部分构成,客户端和认证服务器。认证服务器确认客户端无误后返回一个token,客户端请求带着token访问资源。(一般使用场景是在一个安全的环境下,例如我的同一个系统中,一个api请求另外一个api)。
这里借用下阮一峰老师画的图(博客地址=》http://www.ruanyifeng.com/blog/2014/05/oauth_2_0.html)
IdentityServer4客户端模式实现
首先我们创建一个core的api项目作为认证服务器,添加nuget程序包IdentityServer4,将启动端口设置为5000。
接下来添加一个类,取名字叫做Config,我们用它来初始化Identityserver(配置要保护的资源和可以访问该API的客户端服务器)。
代码如下:
///
/// Idnetity配置,初始化Identityserver
///
publicclassConfig
{
//定义要保护的资源(webapi)
publicstatic IEnumerable GetApiResources()
{
returnnew List
{
new ApiResource("api1", "My API")
};
}
//定义可以访问该API的客户端
publicstatic IEnumerable GetClients()
{
returnnew List
{
new Client()
{
ClientId = "client",
AllowedGrantTypes = GrantTypes.ClientCredentials, //设置模式,客户端模式
ClientSecrets =
{
new Secret("secret".Sha256())
},
AllowedScopes = { "api1" }
}
};
}
}
接下来配置startup,将资源和客户端的初始信息服务加入到DI容器,同时引用IdentityServer中间件。代码如下所示:
public void ConfigureServices(IServiceCollection services)
{
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources()) //配置资源
.AddInMemoryClients(Config.GetClients()); //配置客户端
services.AddMvc();
}
publicvoidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
//使用identityserver中间件
app.UseIdentityServer();
app.UseMvc();
}
再添加一个webapi项目,作为我们的资源服务器。添加nuget包,IdentityServer4.AccessTokenValidation,将启动端口设置为5001。
2、配置startup,添加认证服务器地址,和apiname &&引用中间件,代码如下:
public void ConfigureServices(IServiceCollection services)
{
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000"; //配置Identityserver的授权地址
options.RequireHttpsMetadata = false; //不需要https
options.ApiName = "api1"; //api的name,需要和config的名称相同
});
services.AddMvc();
}
publicvoidConfigure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseAuthentication();// 添加认证中间件
app.UseMvc();
}
将受保护资源controller添加[Authorize]。(因为资源服务器AddIdentityServerAuthentication 方法的参数和返回值都是AuthenticationBuilder(类似于一个中间件),所以可以多次调用AddIdentityServerAuthentication方法来控制这个api 资源可以让谁访问到。)
最开始我们直接访问资源服务器的api,返回401,因为我们的资源被保护了。
这时候来到IdentityServer4的官网,官网给出了这么一个地址=》
我们访问这个地址时候,它会返回我们的Config配置=》
其中有一个token_endpoint的url地址,我们带着Client的配置来访问它=》
此时拿到Token,再带着token去访问我们的资源,争取获取到资源数据=》
https://github.com/conanl5566/dotnet-core-Example/tree/master/WebApplication25