应无所住,而生其心
排名
1
文章
860
粉丝
112
评论
163
net core webapi post传递参数
庸人 : 确实坑哈,我也是下班好了好几次,发现后台传递对象是可以的,但...
百度编辑器自定义模板
庸人 : 我建议换个编辑器,因为现在百度富文本已经停止维护了,用tinymec...
ICP备案 :渝ICP备18016597号-1
网站信息:2018-2025TNBLOG.NET
技术交流:群号656732739
联系我们:contact@tnblog.net
公网安备:50010702506256
欢迎加群交流技术

identity server4身份验证流程分析

6868人阅读 2020/1/17 9:18 总访问:5194447 评论:0 收藏:0 手机
分类: .NET Core

当一个项目登录后,另外一个项目直接拿不到用户信息,必须要加上[Authorize]才能获取获取用户信息,所以我们来分析一下加上[Authorize]后执行的流程是什么,了解清楚后我们就可以在根据源码分析,进一步对ids4掌握好,就可以完成一个个性化定制。


其实当访问带[Authorize]的account/index的时候第一次还是失败了的!还是会报Upprotect ticket failed,这个就和访问不带[Authorize]一样了

但是下面执行的是他会验证了一下权限,发现权限验证失败了(这就是加上Authorize后的区别会验证权限)

然后有个openid会处理,oidc was challenged后就会去请求 /signin-oidc,请求它就能获取到token

请求了signin-oidc后调用handler.HandleRequestAsync()就会成功

并且日志写现实cookie siged in,cookie被签名,cookie签名后才能访问,加上签名和cookie会长很多

访问加了[Authorize]的每次都要去请求一次验证身份的

经过上面的流程分析我们就知道,为什么一个在系统登录后在另外的系统直接拿不到用户信息User.Claims,要访问加了[Authorize]的才能拿到,因为加上特性后才会去验证身体,才会去请求token才会去处理签名cookie。如果直接拿的话在第一步Upprotect ticket failed失败的时候就不会去执行下面的操作了,直接就去访问控制器了。

所以如果要想直接拿到就可以去修改源代码,让不加特性也可以去走一遍这个流程,并且没有登录的情况下也不会跳转到授权中心,可以直接去修改源码定制化实现


我们可以看看身份验证中间件的源码,我们它下载下来直接放到自己项目中去了

加入中间件的扩展方法

  1.  public static class MyAuthAppBuilderExtensions
  2.     {
  3.         public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app)
  4.         {
  5.             if (app == null)
  6.             {
  7.                 throw new ArgumentNullException(nameof(app));
  8.             }
  9.             return app.UseMiddleware<MyAuthenticationMiddleware>();
  10.         }
  11.     }

具体的中间件方法

  1. public class MyAuthenticationMiddleware
  2.     {
  3.         private readonly RequestDelegate _next;
  4.         public MyAuthenticationMiddleware(RequestDelegate next, IAuthenticationSchemeProvider schemes)
  5.         {
  6.             if (next == null)
  7.             {
  8.                 throw new ArgumentNullException(nameof(next));
  9.             }
  10.             if (schemes == null)
  11.             {
  12.                 throw new ArgumentNullException(nameof(schemes));
  13.             }
  14.             _next = next;
  15.             Schemes = schemes;
  16.         }
  17.         public IAuthenticationSchemeProvider Schemes { getset; }
  18.         public async Task Invoke(HttpContext context)
  19.         {
  20.             context.Features.Set<IAuthenticationFeature>(new AuthenticationFeature
  21.             {
  22.                 OriginalPath = context.Request.Path,
  23.                 OriginalPathBase = context.Request.PathBase
  24.             });
  25.             // Give any IAuthenticationRequestHandler schemes a chance to handle the request
  26.             var handlers = context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
  27.             foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
  28.             {
  29.                 var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
  30.                 bool issccuess = await handler.HandleRequestAsync();
  31.                 if (handler != null && issccuess)
  32.                 {
  33.                     return;
  34.                 }
  35.             }
  36.             var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
  37.             if (defaultAuthenticate != null)
  38.             {
  39.                 //这里边成功了才能拿到用户信息
  40.                 var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
  41.                 if (result?.Principal != null)
  42.                 {
  43.                     context.User = result.Principal;
  44.                 }
  45.             }
  46.             await _next(context);
  47.         }
  48.     }


欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)

评价

identity server4 登录成功跳回到signin-oidc得到404

使用identity server4 做单点登录,登录成功后跳转到/signin-oidc得到404,纠结了很久,记录一下。我这里的环境是vs2019和.n...

identity server4 常见错误

登录成功后跳转报错:An error occurred while processing your request可能原因1:登录成功后的跳转地址没有signin-oidc需...

identity server4 实现单点登录

我希望有个如你一般的人我希望有个如你一般的人,如山间清爽的风,如古城温暖的光,从清晨到夜晚,从山野到书房,只要最后...

identity server4 的授权模式

授权模式OAuth2.0 定义了四种授权模式:Implicit:简化模式;直接通过浏览器的链接跳转申请令牌。Client Credentials:客户...

identity server4 四种授权模式

爱情哪有那么复杂,能让你开开心心笑得最甜的那个人就是对的人下面介绍4种模式安全性从低到高客户端模式客户端模式只对客户...

identity server4登录成功后,跳转到原来的页面

我们用identity server4现在访问权限一般都是在某个控制器加上Authorize特性,这样就会访问他的时候跳转到授权中心。这种方...

identity server4身份验证中间件源码

通过下载ids4的源码来看,可以把相关的源码放到自己项目中,方便分析整个流程和进行一些个性化定制,下面贴一下身份验证中...

identity server4判断用户是否已经登录

User.Identity.IsAuthenticated实现这句代码就可以判断了

identity server4 cookie相关配置

如果我们这一配置的话在登录后就可以看到cookie信息

.net core 3.1 identity server4 (ClientCredentials模式)

.net core 3.1 Identity Server4 (ClientCredentials模式)[TOC] ClientCredentials 模式的理解 在这之前我先问大家...

.net core 3.1 Ocelot 与 identity server4 鉴权

目录与前言目录链接:.net core Ocelot 简单网关集群熔断架构整合目录.net core 3.1 Identity Server4 (ClientCredentials...

.net core 3.1 identity server4 (Password模式)

.net core 3.1 Identity Server4 (Password模式)[TOC] Password 模式的理解 当应用程序将用户的用户名和密码交换为...

.net core 3.1 identity server4 (Code模式)

.net core 3.1 Identity Server4 (Code模式)[TOC] Code 模式的理解 大致说一下,这种授权模式的意义。A. 用户通...

.net core 3.1 identity server4 (Implicit模式)

.net core 3.1 Identity Server4 (Implicit模式)[TOC] Implicit 模式的理解 A.用户通过浏览器访问客户端,然后客...

.net core 3.1 identity server4 (Hybrid模式)

.net core 3.1 Identity Server4 (Hybrid模式)[TOC] Hybrid 模式的理解 Hybrid 模式相当于(Code模式+Impact模式),所...