asp.net core 外部认证多站点模式实现

PS:之前因为需要扩展了微信和QQ的认证,使得网站是可以使用QQ和微信直接登录。github 传送门 。然后有小伙伴问,能否让这个配置信息(appid, appsecret)按需改变,而不是在 ConfigureServices  里面写好。

先上 官方文档 :  https://docs.microsoft.com/zh-cn/aspnet/core/security/authentication/social/?view=aspnetcore-2.1 

官方已经实现了 microsft,facebook,twitter,google 等这几个网站认证。代码可以认证授权库看到找到 https://github.com/aspnet/Security  。

国内的QQ和微信其实也是基于OAuth来实现的,所以自己集成还是比较容易。

正常情况下,配置这个外部认证都是在 ConfigureServices 里面配置好,并且使用配置或者是使用机密文件的形式来保存 appid 等信息。

回到正文,多站点模式,就是一个网站下分为多个子站点,并且不同的子站点可以配置不同的appId 。Asp.net core 默认的配置模式,在这种场景下已经适应不了了。

先上代码: https://github.com/jxnkwlp/AspNetCore.AuthenticationQQ-WebChat/tree/muti-site

官方代码分析:

1,RemoteAuthenticationHandler  远程认证处理程序。位于 microsoft.aspnetcore.authentication  下 。 源码 (https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication/RemoteAuthenticationHandler.cs)

这个是泛型类,并且需要一个  TOptions ,这个 TOptions 必须是继承 RemoteAuthenticationOptions 的类。 

2,OAuthHandler 实现 OAuth 认证处理程序,这个类继承 RemoteAuthenticationHandler 。同时必须实现一个 OAuthOptions 。

正常情况下实现 QQ、微信、github ,google ,facebook 等登录都是基于这个来实现的。 OAuthHandler 已经实现了标准的 OAuth 认证。

源码:https://github.com/aspnet/Security/blob/master/src/Microsoft.AspNetCore.Authentication.OAuth/OAuthHandler.cs

在 ConfigureServices 中,使用  AddFacebook 等方法,就是将 对于的 Handler 添加到 处理管道中,这些管到都是实现了 OAuth,然后传递 对应的 Options 来配置Handler 。 

3,回到Account/ExternalLogin ,在提交外部登录的请求中, AuthenticationProperties  properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);  //这行代码的作用是 配置当前外部登录返回URL和认证的相关属性。return Challenge(properties, provider);  // 将结果转到相关相关处理程序。这里返回的结果用于上面  OAuthHandler 作为一个处理参数。从这开始,就进入了 OAuthHandler 的处理范围了。

 

4,查看 OAuthHandler 代码 。  Task HandleChallengeAsync(AuthenticationProperties properties);  这个函数作为接收上一步中传递的 认证参数。   默认实现代码:

640?wx_fmt=png

640?wx_fmt=png

在这里面,构建了一个请求URL, 要求的这个URL 是目标站点授权的URL, 比如微信的那个黑色背景中间有二维码的页面。  这个构建请求URL的方法可以重写。

5,在上一步中,在需要授权的网站,授权完成后,会跳转到自己的网站并且带上授权相关数据。入口是  Task<HandleRequestResult> HandleRemoteAuthenticateAsync();  

改造方法:

在上面的分析中,官方的实现是 在 ConfigureServices 中配置好参数 TOptions ,然后在 Handler 中 获取该参数。我们的目的是在请求中可以按需改变参数,如 client_id。

1,定义一个接口 IClientStore 和 一个实体 ClientStoreModel 。

640?wx_fmt=png

640?wx_fmt=png

IClientStore 用于查找 client 的配置信息

2,在 Account/ExternalLogin 中,新增一个 参数 subjectId  ,表示在当前某个认证(Provider)中是哪个请求(SubjectId) 。

同时在返回的授权配置参数中将subjectId 保存起来。

640?wx_fmt=png

 

3,定义一个 MultiOAuthHandler ,集成 RemoteAuthenticationHandler  ,不继承  OAuthHandler 是因为 这里需要一个新的 Options.  (完整代码 请看代码仓库)  定义: class MultiOAuthHandler<TMultiOAuthOptions>:RemoteAuthenticationHandler<TMultiOAuthOptions>whereTMultiOAuthOptions:MultiOAuthOptions,new() 

在构造函数中添加参数 IClientStore 。

4,在默认的实现中,从外部授权网站跳转回自己的网站的时候,默认的路径是 /signin-{provider} , 比如 /signin-microsoft  。为了区分请求的 subjectId ,  这个默认路径将改为  /signin-{provider}/subject/{subjectId}  。

5,修改 HandleRemoteAuthenticateAsync  ,在开头添加2行代码,用于获取 subjectId 。

var callbackPath = Options.CallbackPath.Add("/subject").Value;var subjectId = Request.Path.Value.Remove(0, callbackPath.Length + 1);

 

6,修改 ExchangeCodeAsync 方法

640?wx_fmt=png

7,还有一些小修改,就不一一列出来了。  到这里  MultiOAuthHandler  相关就调整好了。

我把这个单独出来了  Microsoft.AspNetCore.Authentication.MultiOAuth  

8,使用 。 实现 IClientStore 接口,然后在 ConfigureServices  中添加如下代码:


services.AddAuthentication()
    .AddMultiOAuthStore<MylientStore>()
    .AddMultiWeixinAuthentication(); // 微信

 

9, 目前github 上的demo 只对 微信  做了实现。

原文地址: https://www.cnblogs.com/passingwind/p/9511022.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/320279.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何让敏捷软着陆?

背景当前&#xff0c;敏捷已经成为了2018的热词&#xff0c;执行敏捷研发模式的项目多数都是从瀑布模型转型过来的&#xff0c;瀑布模型是一套根深蒂固的传统流程&#xff0c;如果硬着陆的话&#xff0c;很容易折翼。笔者在各类项目敏捷实施过程中&#xff0c;总结了一些接地气…

牛客网【每日一题】4月24日 子序列

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format:%lld 题目描述 小美有一个由n个元素组成的序列{a1,a2,a3,…,an}&#xff0c;她想知道其中有多少个子序列{ap1,ap2,…,apm}…

[AGC031E] Snuke the Phantom Thief(网络流)

考虑枚举偷的珠宝的个数k&#xff0c;且假设它们按照坐标大小排好了序&#xff08;x坐标排一次&#xff0c;y坐标排一次&#xff09;。 那么可以将条件转化一下&#xff0c; 在珠宝按x坐标排好序时&#xff0c; x坐标大于等于aia_iai​的最多取bib_ibi​个可以转化为取的前k−…

牛妹的游戏

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 UPD:数据保证不会有两条控制链控制的据点完全相同&#xff0c;也保证不会有某条控制链两端控制的据点相同…

.NET Core使用NLog通过Kafka实现日志收集

一、前言NET Core越来越受欢迎&#xff0c;因为它具有在多个平台上运行的原始.NET Framework的强大功能。Kafka正迅速成为软件行业的标准消息传递技术。这篇文章简单介绍了如何使用.NET(Core)和Kafka实现NLog的Target。在日常项目开发过程中&#xff0c;Java体系下Spring Boot …

[清华集训2017]无限之环(网络流)

很妙的一道题 对于每个格子&#xff0c;它合法与否&#xff0c;只跟它上下左右的相邻格子有关&#xff0c;所以可以想到黑白染色 &#xff08;用 (i,j) 表示 i 行 j 列的格子&#xff0c;我把 (ij) %2 0 的格子染成白色&#xff0c;把(ij)%2 1 的格子染成黑色&#xff09; …

ASP.NET Core 中的 ORM 之 Dapper

Dapper简介Dapper是.NET的一款轻量级ORM工具&#xff08;GitHub&#xff09;&#xff0c;也可称为简单对象映射器。在速度方面拥有微型ORM之王的称号。它是半自动的&#xff0c;也就是说实体类和SQL语句都要自己写&#xff0c;但它提供自动对象映射。是通过对IDbConnection接口…

用WinForm/WPF代码来为.NET Core 3.0功能投票

我们在5月报道过微软希望在.NET Core 3.0上运行WinForms和WPF。为了实现这个目标&#xff0c;他们正在构建一个新工具&#xff0c;该工具将允许你投票以决定他们需要把哪些API移植到.NET Core。但是&#xff0c;这不是一次直接进行的投票&#xff0c;而是基于你的应用程序正在使…

病毒扩散

链接&#xff1a; 时间限制&#xff1a;C/C 2秒&#xff0c;其他语言4秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 ![在这里插入图片描述](https://img-blog.csdnimg.cn/20200429210705568.png?x-oss-processimage/waterm…

【SPFA】Party(jzoj 1328)

Party jzoj 1328 题目大意 有一个有向图&#xff0c;给你一个x&#xff0c;让你求每一个点到x再回去的最短路径&#xff0c;输出所有最短路径的最大值 输入样例 4 8 2 1 2 4 1 3 2 1 4 7 2 1 1 2 3 5 3 1 2 3 4 4 4 2 3输出样例 10 样例解释 数据范围 1⩽x⩽N⩽10001\le…

Asp.Net Core 2.2.0-preview1已经发布

原文地址 ASP.NET Core 2.2.0-preview1 now available今天我们很高兴地宣布,现在可以试用ASP.NET Core和.NET Core的下一个次要版本的第一个预览。在过去的几个月里&#xff0c;我们和社区里的许多人一起为这个版本进行开发&#xff0c;现在它已经准备好让更广泛的受众尝试它并…

UOJ284 快乐游戏鸡(树上动态规划问题、长链剖分+单调栈)

Description 一棵 n 个点的有根树&#xff0c;带点权 wi。 从 s 出发&#xff0c;希望达到 t&#xff0c;每秒可以从当前点移动到某一个儿子。 有一个死亡次数&#xff0c;初始为 0。若在某个点 i(i ! s, t) 时&#xff0c;死亡次数 ≤ wi&#xff0c;那么死亡次数自增 1&…

C#系列之聊聊.Net Core的InMemoryCache

这两天在看.net core的in memory cache&#xff0c;这里记录一下用法&#xff0c;主要涉及MemoryCache的Get&#xff0f;Set&#xff0f;Expire&#xff0f;Flush。首先我们先用dotnet命令创建一个mvc的项目&#xff0c;这里我们将使用postman来请求server&#xff0c;1dotnet …

小石的签到题

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 输入描述: 共一行&#xff0c;输入一个数 n 。 输出描述: 共一行&#xff0c;输出 “Shi” 或 “Yang”&…

CAP带你轻松玩转ASP.NETCore消息队列

CAP是什么&#xff1f;CAP是由我们园子里的杨晓东大神开发出来的一套分布式事务的决绝方案&#xff0c;是.Net Core Community中的第一个千星项目&#xff08;目前已经1656 Start&#xff09;&#xff0c;具有轻量级、易使用、高性能等特点。https://github.com/dotnetcore/CAP…

装备合成

链接&#xff1a; 时间限制&#xff1a;C/C 1秒&#xff0c;其他语言2秒 空间限制&#xff1a;C/C 262144K&#xff0c;其他语言524288K 64bit IO Format: %lld题目描述 输入描述: 输入包含t组数据 第一行一个整数t 接下来t行每行两个整数x,y 输出描述: 每组数据输出一行一个…

微软必应从.NET Core 2.1获得了性能提升

据微软工程师Mukul Sabharwal介绍&#xff0c;在将微软搜索引擎必应迁移到.NET Core 2.1之后&#xff0c;内部服务延迟降低了34%&#xff0c;这主要归功于.NET社区贡献的改进。按照Sabharwal的说法&#xff0c;.NET Core的多项改进贡献了大部分的性能提升&#xff0c;包括字符串…

搭建基于云端的中间层以支持跨平台的智能视觉服务

不断演进的应用场景初级应用场景—宅在家里场景&#xff1a;Bob同学有一天在网上看到了一张建筑物的图片&#xff0c;大发感慨&#xff1a;"好漂亮啊&#xff01;这是哪里&#xff1f;我要去亲眼看看&#xff01;"Bob同学不想问别人&#xff0c;可笑的自尊心让他觉得…

高等数学超入门学习笔记

极限 百度百科 1.数列极限 百度百科 1.1 数列 1.2 数列极限 1.3 单调收敛原理 {xn}\{x_n\}{xn​}单调递增且{xn}\{x_n\}{xn​}有上界&#xff08;可以找到实数M使{xn}\{x_n\}{xn​}中任意一项小于M&#xff09;&#xff0c;{xn}\{x_n\}{xn​}收敛&#xff08;存在象限a&…

Microsoft宣布正式发布Linux on ASE

Microsoft宣布正式发布&#xff08;GA&#xff09;用于ASE&#xff08;应用服务环境&#xff0c;App Service Environment&#xff09;的Linux。该服务使客户可结合使用Linux上的应用服务&#xff08;App Service&#xff09;特性与ASE。在正式发布版之前&#xff0c;Microsoft…