asp.net core 使用identityServer4的密码模式来进行身份认证(一)
IdentityServer4是ASP.NET Core的一个包含OpenID和OAuth 2.0协议的框架。具体Oauth 2.0和openId请百度。
前言本博文适用于前后端分离或者为移动产品来后端api的身份认证功能。
一 首先第一步使用Nuge包管理器下载IdentityServer4的包。
第二部,添加一个名叫Config的类。
这个类的作用是对一些api和client进行配置的。
public static IEnumerable<IdentityResource> GetIdentityResource()
{
return new List<IdentityResource>
{
new IdentityResources.OpenId(),
new IdentityResources.Profile(),
new IdentityResources.Email()
};
}
public static IEnumerable<ApiResource> GetApiResource()
{
return new List<ApiResource>
{
new ApiResource("gateway_api","gateway service"), new ApiResource("user_api","user_api service"),
//并且要把contactapi加入到apiResource,并加入到 client的allowedScopes中
// new ApiResource("contact_api","contact_api service")
};
}
public static IEnumerable<Client> GetClients()
{
return new List<Client>()
{
new Client
{
ClientId="pc",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword, //这里是指定授权的模式,选择密码模式,
ClientSecrets = { new Secret("yemobai".Sha256()) },
RefreshTokenUsage=TokenUsage.ReUse,
AlwaysIncludeUserClaimsInIdToken = true,
AllowOfflineAccess = true,
AllowedScopes=new List<string>
{
"user_api",
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.OfflineAccess
} }
};
}
第三步 添加start up的配置
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryApiResources(Config.GetApiResource())
.AddInMemoryIdentityResources(Config.GetIdentityResource())
.AddInMemoryClients(Config.GetClients())
.AddResourceOwnerValidator<ResourceOwnerPasswordValidator>()
.AddProfileService<ProfileService>()
.AddCorsPolicyService<CorsPolicyService>() //这是IdentityServer跨域的,我尝试开启asp.net core 的跨域,但是identityServer不接受请求。
;
public void Configure(IApplicationBuilder app, IHostingEnvironment env,ILoggerFactory loggerFactory)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseIdentityServer(); //启用identityServer中间件
app.UseCors(buider =>
{
buider.WithOrigins("http://localhost:8080")
.AllowAnyHeader();
});
app.UseMvc();
}
第四步 用户验证
其实identityServier4也提供了一些测试用户来进行身份认证的实验,这些东西都在identityServer4的官网上都有介绍。
新建一个类ResourceOwnerPasswordValidator继承与IResourceOwnerPasswordValidator接口(IResourceOwnerPasswordValidator是Identityserver4提供的一个接口其主要工作就是验证我们的用户名和密码)。
这个接口只有一个方法
public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
怎么获取我们传过来的用户名和密码呢?
答:在方法的参数context中,按F12进入到ResourceOwnerPasswordValidationContext这个类的定义中,具体定义的属性如下
//
// 摘要:
// Class describing the resource owner password validation context
public class ResourceOwnerPasswordValidationContext
{
public ResourceOwnerPasswordValidationContext(); //
// 摘要:
// Gets or sets the name of the user.
public string UserName { get; set; }
//
// 摘要:
// Gets or sets the password.
public string Password { get; set; }
//
// 摘要:
// Gets or sets the request.
public ValidatedTokenRequest Request { get; set; }
//
// 摘要:
// Gets or sets the result.
public GrantValidationResult Result { get; set; }
}
可以看到 userName和passWord都已经定义好了,我们只管用就行了。
context.UserName, context.Password
就算用户名和密码和我的数据库的数据对上了,该怎么返回我对用户名和密码的认证结果呢?
答:
如果你是一个细心的人,你会发现上面 ValidateAsync这个方法返回一个Task,可以基本上认为无返回值了。不要着急,看看ResourceOwnerPasswordValidationContext这个类的定义。
GrantValidationResult Result { get; set; }
里面有这么一个属性。看名字都知道是验证结果了。不出意外,我们对用户名和密码的验证接口应该放在这个里面。
那下面就很简单了。
if (accountResult.Status=="登陆成功")
{
context.Result= new GrantValidationResult(accountResult.User.Id.ToString(), "admin", GetUserClaim(accountResult.User));
} else
{
//验证失败
context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "密码错误");
}
具体的构造函数重载,请自己看。如果有需求的不要忘了,把claim给加上。怎么 加claim呢,
最简单的方式你数据库验证用户名和密码完后,把一些claim给带上。
向我这样
public Claim[] GetUserClaim(UserInfo userInfo)
{ var claims = new Claim[] { new Claim("USERID", userInfo.UserId), new Claim("USERNAME", userInfo.UserName) };
return claims;
}
完整代码
public class ResourceOwnerPasswordValidator: IResourceOwnerPasswordValidator
{
private readonly IAccountService accountService;
public ResourceOwnerPasswordValidator(IAccountService _accountService)
{
accountService = _accountService;
}
public async Task ValidateAsync(ResourceOwnerPasswordValidationContext context)
{
var accountResult = await accountService.SignInAsync(context.UserName, context.Password);
if (accountResult.Status=="登陆成功")
{
context.Result= new GrantValidationResult(accountResult.User.Id.ToString(), "admin", GetUserClaim(accountResult.User));
} else
{
//验证失败
context.Result = new GrantValidationResult(TokenRequestErrors.InvalidGrant, "密码错误");
}
}
public Claim[] GetUserClaim(UserInfo userInfo)
{ var claims = new Claim[] { new Claim("USERID", userInfo.UserId), new Claim("USERNAME", userInfo.UserName) };
return claims;
}
测试结果。
是用postmen来进行测试。没有的话请自行下载。

忘了说了,把IdentityServer4的包下载下来后 ,运行项目浏览器输入http://localhost:5000/.well-known/openid-configuration
看看identiyServer4一些接口地址。
然后在在postMen中输入一下Key和value(不要把我的给抄了上去)
scope写不写无所谓,如果你写的了话必须在config类中
public static IEnumerable<ApiResource> GetApiResource()
{
return new List<ApiResource>
{
new ApiResource("gateway_api","gateway service"), new ApiResource("user_api","user_api service"),
//并且要把contactapi加入到apiResource,并加入到 client的allowedScopes中
// new ApiResource("contact_api","contact_api service")
};
}
在这个方法中添加上。而且也要在
public static IEnumerable<Client> GetClients()
{
return new List<Client>()
{
new Client
{
ClientId="pc",
AllowedGrantTypes = GrantTypes.ResourceOwnerPassword,
ClientSecrets = { new Secret("yemobai".Sha256()) },
RefreshTokenUsage=TokenUsage.ReUse,
AlwaysIncludeUserClaimsInIdToken = true,
AllowOfflineAccess = true,
AllowedScopes=new List<string>
{
"user_api",
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.OfflineAccess
} }
};
而且也要在 AllowedScopes里面给加上。

结果

这个时候我们就拿到了access_token和过期时间和refresh_token,
就用了IdentityServer4搞了一个access_token出来。算什么身份认证?
答:下一节解释。
asp.net core 使用identityServer4的密码模式来进行身份认证(一)的更多相关文章
- asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理
前言:本文将会结合asp.net core 认证源码来分析起认证的原理与流程.asp.net core版本2.2 对于大部分使用asp.net core开发的人来说. 下面这几行代码应该很熟悉了. s ...
- Asp.Net Core 中IdentityServer4 授权中心之自定义授权模式
一.前言 上一篇我分享了一篇关于 Asp.Net Core 中IdentityServer4 授权中心之应用实战 的文章,其中有不少博友给我提了问题,其中有一个博友问我的一个场景,我给他解答的还不够完 ...
- Asp.Net Core 中IdentityServer4 授权中心之应用实战
一.前言 查阅了大多数相关资料,查阅到的IdentityServer4 的相关文章大多是比较简单并且多是翻译官网的文档编写的,我这里在 Asp.Net Core 中IdentityServer4 的应 ...
- Asp.Net Core 中IdentityServer4 授权原理及刷新Token的应用
一.前言 上面分享了IdentityServer4 两篇系列文章,核心主题主要是密码授权模式及自定义授权模式,但是仅仅是分享了这两种模式的使用,这篇文章进一步来分享IdentityServer4的授权 ...
- Asp.Net Core 中IdentityServer4 实战之 Claim详解
一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会 ...
- Asp.Net Core 中IdentityServer4 实战之角色授权详解
一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,用到了IdentityServer4的授权,改造过程中发现比较适合基于Role角 ...
- ASP.NET Core路由中间件[2]: 路由模式
一个Web应用本质上体现为一组终结点的集合.终结点则体现为一个暴露在网络中可供外界采用HTTP协议调用的服务,路由的作用就是建立一个请求URL模式与对应终结点之间的映射关系.借助这个映射关系,客户端可 ...
- 【.NET Core】ASP.NET Core之IdentityServer4(1):快速入门
[.NET Core]ASP.NET Core之IdentityServer4 本文中的IdentityServer4基于上节的jenkins 进行docker自动化部署. 使用了MariaDB,EF ...
- 避免在ASP.NET Core中使用服务定位器模式
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:服务定位器(Service Locator)作为一种反模式,一般情况下应该避免使用,在 ...
随机推荐
- Java的Reflection机制
什么时候使用Reflection: 在java语言中,创建一个类的对象通常使用new operator,但是如果预先不知道Class的名字,类名是在程序运行过程中通过参数传递过来,就没法使用这种方法了 ...
- 165. Compare Version Numbers比较版本号的大小
[抄题]: Compare two version numbers version1 and version2.If version1 > version2 return 1; if versi ...
- swift textfield 和 textview 实时获取 输入内容
textfield : func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replac ...
- OC 线程操作 - GCD快速迭代
- (void)forDemo{ //全都是在主线程操作的 ; i<; i++) { NSLog(@"--%@", [NSThread currentThread]); } ...
- 使用Ansible部署etcd 3.2高可用集群
之前写过一篇手动搭建etcd 3.1集群的文章<etcd 3.1 高可用集群搭建>,最近要初始化一套新的环境,考虑用ansible自动化部署整套环境, 先从部署etcd 3.2集群开始. ...
- jquery 处理重新绑定插件的方法
比如有一个slide的jquery插件,页面打开就对dom进行了绑定. <div class="expert"> <div class="expert- ...
- jquery正则表达式验证:验证身份证号码
需求说明: 前端页面使用正则表达式验证文本输入框输入的身份证号码是否符合规则. 代码说明: 这里只介绍正则表达式部分,其他部分的代码不做介绍.如有其它需求请自行修改即可. 步骤一:建立一个页面可以是h ...
- ThinkPHP5路由图解
- StartServiceCtrlDispatcher
服务程序通常编写成控制台类型的应用程序,总的来说,一个遵守服务控制管理程序接口要求的程序 包含下面三个函数: 1.服务程序主函数(main):调用系统函数 StartServiceCtrlDispat ...
- hive的用户和用户权限
HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用mys ...