一,引言

  上次关于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      :B2C_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“ 是因为我之前运行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");
});

  开启认证中间件服务

// open authentication middleware
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.com",
"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

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

Azure AD B2C(二)使用Azure AD B2C为ASP.NET Core 应用设置社交帐户(邮箱)登录/注册的更多相关文章

  1. Azure DevOps (十二) 通过Azure Devops部署一个SpringBoot应用

    文章配套视频专栏: https://space.bilibili.com/38649342/channel/seriesdetail?sid=2267536 视频正在努力更新. 上一篇文章中,我们通过 ...

  2. [App Store Connect帮助]二、 添加、编辑和删除用户(1)用户帐户和职能概述

    您可以在 App Store Connect 的“用户和访问”部分管理用户.添加沙盒测试员以及管理 API 密钥. 用户职能决定了用户对 App Store Connect 和 Apple Devel ...

  3. ASP.NET Core在Azure Kubernetes Service中的部署和管理

    目录 ASP.NET Core在Azure Kubernetes Service中的部署和管理 目标 准备工作 注册 Azure 账户 AKS文档 进入Azure门户(控制台) 安装 Azure Cl ...

  4. asp.net core webapi/website+Azure DevOps+GitHub+Docker

    asp.net core webapi/website+Azure DevOps+GitHub+Docker 新春开篇作,主要写一下关于asp.net core web/api 2.2 项目借助dev ...

  5. 在 Azure WebApps 中运行64位 Asp.net Core 应用

    作为微软下一代的开源的跨平台的开发框架, Asp.net core 正在吸引越来越多的开发者基于其构建现代 web 应用. 目前, Azure App Service 也实现了对 asp.net co ...

  6. ASP.NET Core学习之二 菜鸟踩坑

    对于像我这样没接触过core的人,坑还是比较多的,一些基础配置和以前差别很大,这里做下记录 一.Startup 1.注册服务 // This method gets called by the run ...

  7. ExpandoObject与DynamicObject的使用 RabbitMQ与.net core(一)安装 RabbitMQ与.net core(二)Producer与Exchange ASP.NET Core 2.1 : 十五.图解路由(2.1 or earler) .NET Core中的一个接口多种实现的依赖注入与动态选择看这篇就够了

    ExpandoObject与DynamicObject的使用   using ImpromptuInterface; using System; using System.Dynamic; names ...

  8. asp.net core 使用 signalR(二)

    asp.net core 使用 signalR(二) Intro 上次介绍了 asp.net core 中使用 signalR 服务端的开发,这次总结一下web前端如何接入和使用 signalR,本文 ...

  9. Azure AD(二)调用受Microsoft 标识平台保护的 ASP.NET Core Web API 下

    一,引言 上一节讲到如何在我们的项目中集成Azure AD 保护我们的API资源,以及在项目中集成Swagger,并且如何把Swagger作为一个客户端进行认证和授权去访问我们的WebApi资源的?本 ...

随机推荐

  1. 读Pyqt4教程,带你入门Pyqt4 _004

    在PyQt4教程的这部分中,我们将探讨应用中事件和信号的发生. 事件是GUI程序的重要部分,由用户或者系统产生.当我们调用应用的 exec_() 方法,应用进入主循环.主循环获取事件并把它们发往对象. ...

  2. [Python基础]010.os模块(2)

    os模块(2) 介绍 os 常量 路径 判断路径属性 路径变换 文件属性 相同文件 介绍 - os.path模块,主要处理路径操作,包含了各种处理文件和文件名的方法. os.path 常量 os.pa ...

  3. pandas的loc与iloc

    1. loc是用标签(也就是行名和列名)来查找,标签默认是数字,但也可以通过index参数指定为字符型等其他的类型. 格式是df.loc[行名,列名],如果列标签没有给出,则默认为查找指定行标签的所有 ...

  4. 如何开启远程桌面连接功能?windows的远程桌面连接功能使用步骤

    由于远程桌面的诞生,为电脑工作者提供了极大的便利.首先,推荐1款比较适合服务器管理的远程桌面: 可以管理1000+服务器/vps的远程桌面:IIS7远程桌面管理 开启远程桌面功能步骤: 1.右键点击电 ...

  5. 低功耗SRAM主要三部分功耗来源

    随着SOC 技术的迅猛发展,由电池供电的便携式电子产品得到了广泛应用,如智能手机.运动手环.ipad.部分汽车电子等.近年来半导体工艺已进入深亚微米甚至纳米阶段,工艺尺寸不断缩小,但是由于电池技术的缓 ...

  6. Rocket - debug - TLDebugModuleInner - ABSTRACTAUTO

    https://mp.weixin.qq.com/s/adSB7lmKcqmwVd80-gmdIw 简单介绍TLDebugModuleInner中ABSTRACTAUTO寄存器的实现. 1. ABST ...

  7. Java实现 LeetCode 494 目标和

    494. 目标和 给定一个非负整数数组,a1, a2, -, an, 和一个目标数,S.现在你有两个符号 + 和 -.对于数组中的任意一个整数,你都可以从 + 或 -中选择一个符号添加在前面. 返回可 ...

  8. Java实现 LeetCode 409 最长回文串

    409. 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意 ...

  9. Java实现 蓝桥杯VIP 算法训练 阶乘末尾

    问题描述 给定n和len,输出n!末尾len位. 输入格式 一行两个正整数n和len. 输出格式 一行一个字符串,表示答案.长度不足用前置零补全. 样例输入 6 5 样例输出 00720 数据规模和约 ...

  10. Java实现 LeetCode 167 两数之和 II - 输入有序数组

    167. 两数之和 II - 输入有序数组 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index1 必 ...