


当一个项目登录后,另外一个项目直接拿不到用户信息,必须要加上[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失败的时候就不会去执行下面的操作了,直接就去访问控制器了。
所以如果要想直接拿到就可以去修改源代码,让不加特性也可以去走一遍这个流程,并且没有登录的情况下也不会跳转到授权中心,可以直接去修改源码定制化实现
我们可以看看身份验证中间件的源码,我们它下载下来直接放到自己项目中去了
加入中间件的扩展方法
- public static class MyAuthAppBuilderExtensions
- {
- public static IApplicationBuilder UseMyAuthentication(this IApplicationBuilder app)
- {
- if (app == null)
- {
- throw new ArgumentNullException(nameof(app));
- }
-
- return app.UseMiddleware<MyAuthenticationMiddleware>();
- }
- }
具体的中间件方法
- public class MyAuthenticationMiddleware
- {
- private readonly RequestDelegate _next;
-
- public MyAuthenticationMiddleware(RequestDelegate next, IAuthenticationSchemeProvider schemes)
- {
- if (next == null)
- {
- throw new ArgumentNullException(nameof(next));
- }
- if (schemes == null)
- {
- throw new ArgumentNullException(nameof(schemes));
- }
-
- _next = next;
- Schemes = schemes;
- }
-
- public IAuthenticationSchemeProvider Schemes { get; set; }
-
- public async Task Invoke(HttpContext context)
- {
- context.Features.Set<IAuthenticationFeature>(new AuthenticationFeature
- {
- OriginalPath = context.Request.Path,
- OriginalPathBase = context.Request.PathBase
- });
-
- // Give any IAuthenticationRequestHandler schemes a chance to handle the request
- var handlers = context.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
- foreach (var scheme in await Schemes.GetRequestHandlerSchemesAsync())
- {
- var handler = await handlers.GetHandlerAsync(context, scheme.Name) as IAuthenticationRequestHandler;
- bool issccuess = await handler.HandleRequestAsync();
- if (handler != null && issccuess)
- {
- return;
- }
- }
-
- var defaultAuthenticate = await Schemes.GetDefaultAuthenticateSchemeAsync();
- if (defaultAuthenticate != null)
- {
- //这里边成功了才能拿到用户信息
- var result = await context.AuthenticateAsync(defaultAuthenticate.Name);
- if (result?.Principal != null)
- {
- context.User = result.Principal;
- }
- }
-
- await _next(context);
- }
- }
欢迎加群讨论技术,1群:677373950(满了,可以加,但通过不了),2群:656732739。有需要软件开发,或者学习软件技术的朋友可以和我联系~(Q:815170684)