asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

前言

OAuth 2.0默认四种授权模式(GrantType)

  • 授权码模式(authorization_code)
  • 简化模式(implicit)
  • 密码模式(resource owner password credentials
  • 客户端模式(client_credentials)

本章主要介绍密码模式(resource owner password credentials),OAuth2.0资源所有者密码授权功能允许客户端将用户名和密码发送到令牌服务,并获得该用户的访问令牌.

认证步骤:

  • 用户将用户名密码提供给客户端
  • 客户端再将用户名密码发送给授权服务器,请求令牌
  • 授权服务器确定判断信息是否有误,返回给客户端令牌

创建授权服务器

创建一个API项目工程,我这边以端口5000的形式进行后面的讲解.

Package

PM> Install-package IdentityServer4 -version 2.5.3网址:yii666.com

创建一个类Config(配置要保护的资源,和可以访问的API的客户端服务器)

   public class Config
{
/// <summary>
/// 定义要保护的资源
/// </summary>
/// <returns></returns>
public static IEnumerable<ApiResource> GetApiResources() {
return new List<ApiResource>
{
new ApiResource("api1","MyApi")
};
}
/// <summary>
/// 定义授权客户端
/// </summary>
/// <returns></returns>
public static IEnumerable<Client> GetClients() {
return new List<Client>
{
new Client(){
ClientId="client",
AllowedGrantTypes=GrantTypes.ResourceOwnerPassword,
ClientSecrets=
{
new Secret("secret".Sha256())
},
AllowedScopes={ "api1",IdentityServerConstants.StandardScopes.OfflineAccess //如果要获取refresh_tokens ,必须在scopes中加上OfflineAccess
},
AllowOfflineAccess=true// 主要刷新refresh_token, }
};
}
}

此处AllowedGrantTypes需要设置为ResourceOwnerPassword(密码凭证).

配置Startup

再走到ConfigureServices方法注入IdentityServer4服务文章来源地址https://www.yii666.com/article/764235.html

   public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddResourceOwnerValidator<ResourceOwnerPasswordValidator>();//注入自定义登录验证 }

IdentityServer4默认提供了两种证书加密配置

AddDeveloperSigningCredential AddTemporarySigningCredential

添加内存ApiResourceAddInMemoryApiResources

添加内存Client AddInMemoryClients

添加自定义登录验证AddResourceOwnerValidator

自定义用户验证
    public class ResourceOwnerPasswordValidator : IResourceOwnerPasswordValidator
{
public Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
if (context.UserName == "test" && context.Password == "test")
{
context.Result = new GrantValidationResult(
subject: context.UserName,
authenticationMethod: OidcConstants.AuthenticationMethods.Password);
}
else
{
//验证失败
context.Result = new GrantValidationResult(
TokenRequestErrors.InvalidGrant,
"invalid custom credential"
);
}
return Task.FromResult(0);
}
}

在Configure方法中添加IdentityServer4服务中间件

app.UseIdentityServer();

创建ApiResource

创建一个客户端项目,这边我将端口设置为5001文章地址https://www.yii666.com/article/764235.html

Package

PM> Install-package IdentityServer4 -version 2.5.3

配置Startup

在ConfigureServices添加认证服务器地址

      public void ConfigureServices(IServiceCollection services)
{
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
services.AddAuthentication("Bearer")
.AddIdentityServerAuthentication(options =>
{
options.Authority = "http://localhost:5000";//授权服务器地址
options.RequireHttpsMetadata = false;//不需要https
options.ApiName = "api1";
});
}

在Configure方法中添加认证服务中间件

app.UseAuthentication();

Run

在客户端程序values控制器上面增加[Authorize]文章来源地址:https://www.yii666.com/article/764235.html

直接访问资源服务器http://localhost:5001/api/values

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

code 401

启动授权服务器

http://localhost:5000/.well-known/openid-configuration

发现端点可通过/.well-known/openid-configuration

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

获取token

这边我用postman进行测试

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

code 200

access_token我们获取到了,再拿着token通过postman请求资源程序,

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

code 200

成功了

refresh_token

获取请求授权接口后会返回access_token expires

_in 等内容,expires_in是有效期(s),当然我们可以自定义有效期,access_token失效后用户需要重新授权,client才能拿到新的access_token.但是有了refresh_token后,client检测到token失效后可以直接通过refresh_token向授权服务器申请新的token,当然refresh_token也是有有效期的。

AbsoluteRefreshTokenLifetime的默认有效期为2592000秒/30天。SlidingRefreshTokenLifetime的默认有效期为1296000秒/15天。

在认证服务器中我再scopes加上了OfflineAccess

IdentityServerConstants.StandardScopes.OfflineAccess //如果要获取refresh_tokens ,必须在scopes中加上OfflineAccess网址:yii666.com<

获取refresh_token

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

通过refresh_token再去获取access_token

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

通过postman请求获取资源

asp.net core IdentityServer4 实现 resource owner password credentials(密码凭证)

概要

示例地址https://github.com/fhcodegit/IdentityServer4.Samples

版权声明:本文内容来源于网络,版权归原作者所有,此博客不拥有其著作权,亦不承担相应法律责任。文本页已经标记具体来源原文地址,请点击原文查看来源网址,站内文章以及资源内容站长不承诺其正确性,如侵犯了您的权益,请联系站长如有侵权请联系站长,将立刻删除

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信图片_20190322181744_03.jpg

微信扫一扫打赏

请作者喝杯咖啡吧~

支付宝扫一扫领取红包,优惠每天领

二维码1

zhifubaohongbao.png

二维码2

zhifubaohongbao2.png