asp.net core 使用identityServer4的密码模式来进行身份认证(一)

原文: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出来。算什么身份认证?

答:下一节解释。

原文地址:https://www.cnblogs.com/lonelyxmas/p/10527605.html

时间: 2024-10-09 15:05:51

asp.net core 使用identityServer4的密码模式来进行身份认证(一)的相关文章

asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理

原文:asp.net core 使用identityServer4的密码模式来进行身份认证(2) 认证授权原理 前言:本文将会结合asp.net core 认证源码来分析起认证的原理与流程.asp.net core版本2.2 对于大部分使用asp.net core开发的人来说. 下面这几行代码应该很熟悉了. services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { o

Asp.Net Core 中IdentityServer4 实战之 Claim详解

一.前言 由于疫情原因,让我开始了以博客的方式来学习和分享技术(持续分享的过程也是自己学习成长的过程),同时也让更多的初学者学习到相关知识,如果我的文章中有分析不到位的地方,还请大家多多指教:以后我会持续更新我的文章,望大家多多支持和关注. 上几篇文章主要分享了IdentityServer4在Asp.Net Core 3.x 中的应用,在上面的几篇分享中有一部分博友问了我这么一个问题"他通过IdentityServer4 来搭建授权中心网关服务,怎么才能在访问受保护的Api资源中获取到用户的相关

Asp.Net Core 中IdentityServer4 实战之角色授权详解

一.前言 前几篇文章分享了IdentityServer4密码模式的基本授权及自定义授权等方式,最近由于改造一个网关服务,用到了IdentityServer4的授权,改造过程中发现比较适合基于Role角色的授权,通过不同的角色来限制用户访问不同的Api资源,这里我就来分享IdentityServer4基于角色的授权详解. IdentityServer4 历史文章目录 Asp.Net Core IdentityServer4 中的基本概念 Asp.Net Core 中IdentityServer4

【.NET Core】ASP.NET Core之IdentityServer4(1):快速入门

本文中的IdentityServer4基于上节的jenkins 进行docker自动化部署. 使用了MariaDB,EF Core,AspNetIdentity,Docker Demo地址:https://sso.neverc.cn Demo源码:https://github.com/NeverCL/Geek.IdentityServer4 简介 OpenID Connect :常用的认证协议有SAML2p, WS-Federation and OpenID Connect – SAML2p.O

asp.net core系列 56 IS4使用OpenID Connect添加用户认证

一.概述 在前二篇中讲到了客户端授权的二种方式: GrantTypes.ClientCredentials凭据授权和GrantTypes.ResourceOwnerPassword密码授权,都是OAuth2.0协议.本篇使用OpenID Connect添加用户认证,客户端授权是GrantTypes.Implicit隐式流授权,是OCID协议. 本篇示例中只有二个项目:一个IdentityServer的mvc应用程序,一个客户端mvc应用程序(用户client端). 下面介绍身份认证交互流程: (

asp.net core网关Ocelot的简单介绍&amp; Ocelot集成Identity认证

原文地址:https://www.cnblogs.com/liumengchen-boke/p/11223377.html

ASP.NET Core实现OAuth2.0的AuthorizationCode模式

ASP.NET Core实现OAuth2的AuthorizationCode模式 授权服务器 Program.cs --> Main方法中:需要调用UseUrls设置IdentityServer4授权服务的IP地址 1             var host = new WebHostBuilder()2                 .UseKestrel()3                 //IdentityServer4的使用需要配置UseUrls4                

ASP.NET Core 1.1 静态文件、路由、自定义中间件、身份验证简介

概述 之前写过一篇关于<ASP.NET Core 1.0 静态文件.路由.自定义中间件.身份验证简介>的文章,主要介绍了ASP.NET Core中StaticFile.Middleware.CustomizeMiddleware和Asp.NetCore Identity.但是由于所有的ASP.NET Core的版本有些老,所以,此次重写一次.使用最新的ASP.NET Core 1.1版本.对于ASP.NET Core 1.1 Preview 1会在以后的文章中介绍 目录 使用静态文件 使用路由

.NET Core + Ocelot + IdentityServer4 + Consul 基础架构实现

先决条件 关于 Ocelot 针对使用 .NET 开发微服务架构或者面向服务架构提供一个统一访问系统的组件. 参考 本文将使用 Ocelot 构建统一入口的 Gateway. 关于 IdentityServer4 IdentityServer4 是一个 OpenID Connect 和 OAuth 2.0 框架用于 ASP.NET Core .IdentityServer4 在你的应用程序中集成了基于令牌认证.单点登录.API访问控制所需的所有协议和扩展点.参考 本文将使用 IdentitySe