使用Azure AD B2C为ASP.NET Core 设置登录/注册

一,引言

  上次关于Azure AD B2C 讲到一些概念,有介绍到,Azure AD B2C 也是一种身份验证的解决方案,但是它运行客户使用其首选的社交,企业或者本地账户标识对应用程序和API进行单一登录访问。同样,Azure AD B2C 使用基于标准的身份验证协议,包括 OpenID Connect、OAuth 2.0 和 SAML。 它与大多数第三方的 idp 进行集成。今天,介绍如何使用 Azure Active Directory B2C (Azure AD B2C) 在 ASP.NET Web 应用程序中进行用户登录和注册。 应用程序可以使用 Azure AD B2C 通过开放式标准协议对社交帐户、企业帐户和 Azure Active Directory 帐户进行身份验证。

二,正文

2.1,创建B2C租户

  Azure Portal 左侧菜单 点击“创建资源”,同时搜索框中输入 “ Azure Active Directory B2C”。

   点击 “创建” 按钮

  选择 “创建新的 Azure Active AD B2C 租户”

   输入 “组织名称”,"域名",“区域”,“资源组”等名称

  Organization name:CnBate B2C

  Initial domain name:cnbateb2c

 

  继续选择 ”Azure Active Directory B2C “,选择 ”Link an existing Azure AD B2C to my Azure subscription“ 连接Azure AD B2C租户到当前自己的订阅 

   选择刚刚注册的 B2C 租户,

  Resource group      :CnBate_RG      

  点击 ”create“

   将Azure AD B2C 添加到左侧菜单,在“所有服务” 搜索框中,搜索“Azure AD B2C” ,将鼠标悬停在搜索结果上,然后在工具提示中选择星形图标。 “Azure AD B2C”现在会显示在 Azure 门户中的“收藏夹”下。

 

 

 2.2,注册应用程序

  在门户工具栏中选择“目录 + 订阅”图标,然后选择包含 Azure AD B2C 租户的目录,切换成功后,在Azure Portal的左侧菜单上选择 ”Azure AD B2C“,在 Azure AD B2C 页面选择 ” 应用程序(旧版)“,点击 ” 添加按钮“

-----------------敲黑板了----------------------

(这里先说一下,一定要选择”应用程序(旧版)“,文章的最后会说明为什么)

  输入应用程序的名称。 例如,“WebApp”;包含Web应用/Web API和运行隐式流,选择 ”是“;回复URL,暂时先填写 ”https://jwt.ms“,因为此时我们还没有新建ASP.NET Core 的web应用,此地址是用来检查令牌的,可以用来测试。(截图里面填写的 ”http://localhost:9020/sign-oidc“ 是因为我之前运行demo,我自己本地的一个Web应用的地址,所以大家暂时忽略这个)

 

 2.3,创建用户流 

  选择 ”策略“-》"用户流",点击 ”新建用户流“

 

 

  在“建议”选项卡上选择“注册和登录”用户流。

 

  输入该用户流的名称 ”B2C_1_signupsignin1“;标识提供者 勾选 ”邮件注册“;用户特性和声明 收集特性和返回声明勾选 ”姓“,”名“,”城市“,用户特性和声明勾选的选项意思是在注册期间要从用户收集并发送的声明和属性。 例如,“城市”和“姓”,”名“ 所对应的属性和声明。

 

   选择运行流,选择前面已注册的名为 WebApp 的 Web 应用程序。

   此时,我们可以看到一个标准模板的登录注册的页面,点击 ”Sign up now“,进行注册。

 

   输入有效的电子邮件地址,单击“发送验证码”,输入收到的验证码,然后选择“验证代码”。

   查看验证码,并且对验证码进行校验,并且输入相应的 ”姓“,”名“,”城市“,以及 ”登录密码“,点击 ”Create“

 

 

 令牌将返回到 https://jwt.ms 并显示出来。

 2.4,创建ASP.NET Core Web 应用

 安装:Microsoft.AspNetCore.Authentication.AzureADB2C.UI

  需要注册验证服务,这个地方默认的是 “AzureADB2C”,AddAzureADB2C方法绑定Azure AD B2C身份验证终结点,回调地址,租户所在的自定义域,客户端Id,以及登录/注册,重置密码,编辑信息的策略Id,其实也就是刚刚在B2C租户中新建工作流的名称。

   注册Azure AD B2C 认证服务

services.AddAuthentication(AzureADB2CDefaults.AuthenticationScheme).AddAzureADB2C(options=> {options.Instance = Appsettings.app("Azure_AD_B2C", "Instance");options.ClientId = Appsettings.app("Azure_AD_B2C", "ClientId");options.CallbackPath = Appsettings.app("Azure_AD_B2C", "CallbackPath");options.Domain = Appsettings.app("Azure_AD_B2C", "Domain");options.SignUpSignInPolicyId = Appsettings.app("Azure_AD_B2C", "SignUpSignInPolicyId");options.ResetPasswordPolicyId = Appsettings.app("Azure_AD_B2C", "ResetPasswordPolicyId");options.EditProfilePolicyId = Appsettings.app("Azure_AD_B2C", "EditProfilePolicyId");});

开启认证中间件服务

app.UseAuthentication();

 appsettings.json的配置文件

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","Azure_AD_B2C": {"Instance": "https://cnbateb2c.b2clogin.cn/tfp","ClientId": "39280bbe-bfda-46b8-91c4-f96376f363d9","CallbackPath": "/signin-oidc","Domain": "cnbateb2c.partner.onmschina.cn","SignUpSignInPolicyId": "B2C_1_signupsignin1","ResetPasswordPolicyId": "","EditProfilePolicyId": ""}
}"Instance": "https://<your-tenant-name>.b2clogin.cn/tfp",
"ClientId": "<web-app-application-id>",
"Domain": "<your-b2c-domain>"
"CallbackPath": "/signin-oidc",
"SignUpSignInPolicyId": "B2C_1_test",
"ResetPasswordPolicyId": "",
"EditProfilePolicyId": ""

 

   HomeController=》about 方法加上 [Authorize] 

  修改项目启动端口

 再回到 Azure Portal,为刚刚注册的Azure AD B2C租户里面的WebApp应用设置新的回调地址 “http://localhost:9020/signin-oidc

 

 

 

 

 

 

 

 

 大功告成!

三,问题汇总

问题1,B2C 应用注册可以选择 “应用注册”,而不是“应用注册旧版”吗?

  不可以,Run user flow 中不能选择 “应用注册” 里面的应用,目前在中国区B2C使用应用注册(预览)支持以下2种类型的account type, 这2种账号类型是用于devops场景,因此,不应该使用user flow 来验证这个类型的用户。因此,Run user flow中不能选择应用注册(预览)里面的应用,这是by design的。

问题2,应用注册的终结点为什么当前注册的B2C租户的域不一致?例如下图,一个是 com结尾,一个是 “cn”结尾

 答,这是azure 中国区的一个bug,我在4月份就反馈过类似的问题,之前他们是把终结点链接的域名后缀写成com了,但是5月份他们更新的时候,应该没有注意域名后面的当前租户的链接地址

四,结尾

 今天的文章大概介绍了如果在我们的Web项目中集成Azure AD B2C,通过使用第三方的社交账号 “邮箱”进行注册,登陆。下一篇继续介绍如何使用Azure AD B2C 保护的API资源。

代码稍等,我会整理一下,上传到github中

版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。

作者:Allen 版权:转载请在文章明显位置注明作者及出处。如发现错误,欢迎批评指正。

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

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

相关文章

使用 Azure Function 定时启动云 VM

点击上方蓝字关注“汪宇杰博客”导语微软 Azure 平台的 VM 可以做到定时自动关机&#xff0c;然而只有 DevTest Lab 服务中的 VM 能够定时开机&#xff0c;普通用途的 VM 还没有上线这个功能。但是没关系&#xff0c;我们可以曲线救国&#xff0c;通过最新版的 Azure Function …

文章目录 | .NET Core on K8s学习之旅 (更新至20200618)

.NET Core on K8s学习之旅更新记录&#xff1a;-- 20200511 增加Ingress & Nginx Ingress介绍-- 20200515 增加Ocelot API网关集成示例介绍-- 20200525 增加Ingress实现灰度发布示例介绍1关于这个系列文章自从2018年底离开工作了3年的M公司加入X公司之后&#xff0c;开始了…

【Blog.Core重要升级】:封装服务扩展层

昨天有群里小伙伴咨询了一个问题&#xff1a;关于如何在Blog.Core项目中&#xff0c;实现多资源终端的问题&#xff0c;比如这样&#xff1a;一个AdminMvc的管理后台&#xff08;MVC项目&#xff09;&#xff0c;一个WebApi项目&#xff0c;一个ConsoleApp的控制台项目&#xf…

如何激发团队潜能?

每个技术人员最终可能都会走上管理岗位&#xff0c;从最初的开发 Leader、到部门负责人、甚至到 CTO,这每一个角色的转变&#xff0c;都需要付出巨大的努力去进行思维的转变。最近读的《授权》这本书可以让我们更好地胜任管理这个岗位。本书的作者马凯特是一名海军军官&#xf…

快速打造属于你的接口自动化测试框架

1 接口测试接口测试是对系统或组件之间的接口进行测试&#xff0c;主要是校验数据的交换&#xff0c;传递和控制管理过程&#xff0c;以及相互逻辑依赖关系。接口自动化相对于UI自动化来说&#xff0c;属于更底层的测试&#xff0c;这样带来的好处就是测试收益更大&#xff0c;…

Java Number Math 类方法

Java Math 类 Java 的 Math 包含了用于执行基本数学运算的属性和方法&#xff0c;如初等指数、对数、平方根和三角函数。 Math 的方法都被定义为 static 形式&#xff0c;通过 Math 类可以在主函数中直接调用。 public class Test { public static void main (String []args…

研发协同平台数据库死锁处理及改进

源宝导读&#xff1a;数据库死锁是高并发复杂系统都要面临课题&#xff0c;处理死锁问题没有一招制敌的标准方法&#xff0c;需要具体问题具体分析。本文将基于研发协同平台遇到的死锁案例&#xff0c;介绍从监控、分析到处理的完整过程和经验总结。一、背景研发协同平台使用的…

Java substring() 方法

substring() 方法返回字符串的子字符串。 语法 public String substring(int beginIndex)或public String substring(int beginIndex, int endIndex)参数 beginIndex – 起始索引&#xff08;包括&#xff09;, 索引从 0 开始。 endIndex – 结束索引&#xff08;不包括&…

简单说说async/await

小明用async/await写了几年的异步方法&#xff0c;但总没有完全理解里面的机制&#xff0c;他决定去请教邻居小花。小花听了小明的描述后说&#xff1a;首先你要明白异步的根本是什么&#xff1f;大白话解释异步就是&#xff1a;拉一个人&#xff08;线程&#xff09;帮着做一些…

Newtonsoft 六个超简单又实用的特性,值得一试 【下篇】

一&#xff1a;讲故事上一篇介绍的 6 个特性从园子里的反馈来看效果不错&#xff0c;那这一篇就再带来 6 个特性同大家一起欣赏。二&#xff1a;特性分析1. 像弱类型语言一样解析 json大家都知道弱类型的语言有很多&#xff0c;如: nodejs&#xff0c;python&#xff0c;php&am…

C++实现双栈结构(一个顺序表中使用两个栈)

因为平常栈中push的数据不会太多&#xff0c;为了节约空间&#xff0c;所以可以在一个顺序表中使用两个栈 结构图: 在这里我会留一个空间用来判断栈是否满&#xff01; #include <iostream> using namespace std; typedef int ElemType;class DoubleStack { private:El…

Redis凭啥这么快?只能做缓存?架构师道出了真相(颠覆你的认知)

Redis到底有多快Redis采用的是基于内存的采用的是单进程单线程模型的 KV 数据库&#xff0c;由C语言编写&#xff0c;官方提供的数据是可以达到100000的QPS&#xff08;每秒内查询次数&#xff09;。这个数据不比采用单进程多线程的同样基于内存的 KV 数据库 Memcached 差&…

Java面向对象编程(基础部分)

面向对象编程(基础部分) 类与对象 01&#xff1a; public class ObjectWorkDemo {public static void main(String[] args){Cat cat1 new Cat();cat1.name "Tom";cat1.age 3;cat1.color "white";Cat cat2 new Cat();cat2.name "xiaohua"…

Blazor带我重玩前端(一)

写在前面曾经我和前端朋友聊天的时候&#xff0c;我说我希望有一天可以用C#写前端&#xff0c;不过当时更多的是美好的想象&#xff0c;这一切正变得真实……什么是Blazor我们知道浏览器可以正确解释并执行JavaScript代码&#xff0c;那么浏览器是如何执行C#代码的呢&#xff1…

Java面向对象编程(中级)

面向对象编程(中级) 包 访问修饰符 封装 01: public class Encapsulation01 {public static void main(String[] args){Person person new Person();person.name "Tom";person.setAge(30);person.setSalary(30000);} }class Person {public String name;private…

[Mvp.Blazor] 动态路由与钩子函数

&#xff08;Blazor组件的生命周期函数&#xff09;一直在学习也没有停下脚步&#xff0c;用着脑子还是挺好的&#xff0c;感觉可以更脚踏实地一下。最近偶尔也继续看了看Blazor&#xff0c;毕竟我也开源了一个项目嘛&#xff0c;基本我正式开源的项目都会负责到底&#xff0c;…

Java面向对象编程(高级)

面向对象编程(高级) 类变量和类方法 01: package ChildDemo;public class Child {private String name;public static int cnt 0;public Child(String name){this.name name;}public void join(){System.out.println(name "join the game");} }//package ChildDe…