我的博客园:https://www.cnblogs.com/CQman/

转载:
https://mp.weixin.qq.com/s?__biz=MzU0MzUxMzU2NA==&mid=2247485879&idx=1&sn=f1afe480d0b39ec54b3ee55c94cd3440&chksm=fb0b0704cc7c8e125211b497c496832cfc14f965772dc28bbd3274b92de011ddf2cb05d1a881&mpshare=1&scene=2&srcid=07107OHGWDElfz6XRoq9aJtI&sharer_sharetime=1657414303496&sharer_shareid=2c1d14bf668186cb790856d635b6c409#rd
 
Original Office365 Office365云服务技术支持

Office365云服务技术支持

Weixin ID VNET_O365Support

About Feature 由世纪互联运营的 Office 365 云服务技术支持

2022-07-10 08:45 Posted on 北京

收录于合集
 

我们之前已经向大家发布了Exchange Online 服务即将停用基本身份验证的说明和提醒。

Exchange Online服务即将停用基本身份验证

Office365,公众号:Office365云服务技术支持Exchange Online服务即将停用基本身份验证

而在诸多实际的生产场景中,绝大多数网络打印机厂商、OA 及其他集成系统、邮件客户端还不支持通过 OAuth 认证方式连接 POP、IMAP 或 SMTP。随着停用基本身份验证的时间临近,我们敦促和建议广大接口厂商和系统集成合作伙伴,尽快改用 OAuth 认证方式来连接 POP、IMAP 和 SMTP。

针对这种情况,今天就向大家说明一下,如何使用现代身份验证(OAuth) 来连接 POP、IMAP 和 SMTP。请注意,以下说明只是针对各大厂商对代码进行修改,一般用户无法直接使用 OAuth 方式来连接 POP、SMTP 等协议。

准备工作

如果您还不了解什么是 OAuth,请参考我们之前发布的文档 使用现代身份验证(OAuth)调用 EWS 服务 中的关于 OAuth 是什么 的部分说明:

使用现代身份验证(OAuth)调用 EWS 服务

Robin Dai,公众号:Office365云服务技术支持使用现代身份验证(OAuth)调用 EWS 服务

如果您对 OAuth 申请令牌凭证已经有了一定的了解,那么请继续以下的步骤。

首先注册一个 Azure AD 应用:

  • 通过浏览器访问并登录以下网址:
    https://portal.azure.cn/#blade/Microsoft_AAD_IAM/ActiveDirectoryMenuBlade/RegisteredApps

  • 点击“新注册”,并输入名称,来注册出一个应用。

  • 证书和密码中创建一个客户端密码并记住这个密码

  • 在API权限中添加权限:

    • 点击添加权限

    • 点击 Microsoft Graph

    • 选择委托的权限中的 SMTP.Send 、POP.AccessAsUser.All 和 IMAP.AccessAsUser.All 勾选并保存。

  • 在 API 权限中点击代表***授予管理员权限

请求OAuth令牌

请求OAuth令牌,是一个关键步骤。由于 Azure AD 的终结点本身存在1.0和2.0两个版本,在这里,我们推荐大家使用1.0版本,以避免在使用2.0版本时,错误的scope参数而导致请求到无效的令牌。

由于该令牌必须有用户参与,因此无法使用客户端密码的方式(grant_type=client_credential)调用,而仅能使用代码授予(grant_type=authorization_code)或用户密码凭据授予(grant_type=password)的方式获取。后面两者的区别在于代码授予一定会弹出要求用户登录的页面,而 用户密码凭据授予可以保持静默登录,但安全性将打折扣

请求内容如下(以用户密码凭据授予为例,请将自己的租户 ID、注册应用 ID、客户端密码、用户名和密码替换示例中的{tenant ID}、{App ID}、{Client Secret}、user@abc.com和{user password}。):

HTTP

POST https://login.partner.microsoftonline.cn/{tenant ID}/oauth2/token HTTP 1.1

Host: login.partner.microsoftonline.cn

Content-Type: application/x-www-form-urlencoded

client_id={App ID}

&client_secret={Client Secret}

&grant_type=password

&resource=https%3A%2F%2Fpartner.outlook.cn

&username=user%40abc.com

&password={user password}

cURL

curl -X POST -H "Content-Type: application/x-www-form-urlencoded" -d 'client_id={App ID}&resource=https%3A%2F%2Fpartner.outlook.cn%2F.default&client_secret={Client Secret}&grant_type=password&username=user%40abc.com&password={user password}'  'https://login.partner.microsoftonline.cn/{tenant}/oauth2/token'

使用OAuth令牌进行连接

在您得到 OAuth令牌后,您需要以 SASL XOAUTH2 的格式来转换和发送凭据。SASL XOAUTH2 以以下格式将用户名、访问令牌编码在一起:

Text

base64("user=" + userName + "^Aauth=Bearer " + accessToken + "^A^A")

^A 表示 Control + A () %x01 。

例如,使用访问令牌eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlBOGtWal9hcXpVOWAA(此处缩略了很长一部分),访问的 user@abc.com, SASL XOAUTH2 格式为:

Text

base64("user=user@abc.com^Aauth=Bearer eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlBOGtWal9hcXpVOWAA^A^A")

在 base64 编码后,这会转换为以下字符串:

Text

dXNlcj11c2VyQGFiYy5jb21eQWF1dGg9QmVhcmVyIGV5SjBlWEFpT2lKS1YxUWlMQ0p1YjI1alpTSTZJamxCT0d0V2FsOWhjWHBWT1dBQV5BXkE=

在连接不同协议时,连接的形式略有不同,具体请参考:

POP:

Text

AUTH XOAUTH2

<base64 string in XOAUTH2 format>

IMAP:

Text

AUTHENTICATE XOAUTH2 <base64 string in XOAUTH2 format>

SMTP:

Text

AUTH XOAUTH2 <base64 string in XOAUTH2 format>

目前就我们的测试,Java.mail 和 Mailkit 库可以支持SASL XOAUTH2方式的连接。以C# 调用 Mailkit 库,通过OAuth方式连接SMTP发送邮件为例,参考代码如下(已略过请求令牌的代码):

C#

usingSystem;

usingSystem.Collections.Generic;

usingSystem.Linq;

usingSystem.Text;

usingSystem.Threading.Tasks;

usingSystem.Net;

usingMailKit.Net.Smtp;

usingMailKit.Security;

usingMimeKit;

usingMailKit;

namespaceOAuth2forMail

{

classProgram

{

staticvoidMain(string[] args)

{

varp = newProgram();

p.Sendmm();

}

voidSendmm()

{

MimeMessagemm = newMimeMessage();

mm.To.Add(newMailboxAddress("My Customer", "customer@abc.com"));

mm.From.Add(newMailboxAddress("Boss Wang", "user@abc.com"));

varbuilder = newBodyBuilder();

builder.TextBody = @"This is a test mail.";

mm.Subject = "Test to send mail with OAuth2";

mm.Body = builder.ToMessageBody();

SaslMechanismOAuth2oauth2 = newSaslMechanismOAuth2("user@abc.com",

"eyJ0eXAiOiJKV1QiLCJub25jZSI6IjlBOGtWal9hcXpVOWAA"

);

using (varclient = newSmtpClient(newProtocolLogger("smtp.log")))

{

client.Connect("smtp.partner.outlook.cn", 587, SecureSocketOptions.StartTls);

client.Authenticate(oauth2);

try

{

client.Send(mm);

Console.WriteLine("send success");

client.Disconnect(true);

}

catch (Exceptionex)

{

Console.WriteLine(ex.Message.ToString());

}

}

}

}

}

综上,建议各大厂商、开发人员尽快修改您的代码,以便支持OAuth的方式来连接POP、IMAP和SMTP协议。

 
 
 
Got It
Scan with Weixin to
use this Mini Program
 
 
 
Cancel Allow
 
 
 
Cancel Allow

: , .   Video Mini Program Like ,轻点两下取消赞 Wow ,轻点两下取消在看

使用现代身份验证(OAuth)来连接POP、IMAP或SMTP的更多相关文章

  1. 138企业邮箱pop/imap和smtp服务器地址

    如果客户端设置的是pop模式:接收邮件服务器(pop):pop.138mail.net ,端口号是110 (如果勾选了SSL,端口号则变为995)发送邮件服务器(smtp):smtp.138mail. ...

  2. mac下远程win8.1时提示"桌面连接无法验证您希望连接的计算机的身份"的解决办法

    在os x下使用远程桌面到win8.1,总出现“远程桌面连接无法验证您希望连接的计算机的身份”的提示. 解决方法:1.网上各种解释,包括防火墙是否打开,是否去掉“仅允许运行使用网络级别身份验证的远程计 ...

  3. windows身份验证模式和SQL server身份验证模式 有什么不同

    两个验证方式是有明显不同的. 主要集中在信任连接和非信任连接. windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不判断sa密码,而仅根据用户的windows权限来进行身份验证 ...

  4. Windows身份验证和混合验证的差别

    两个验证方式的不同主要集中在信任连接和非信任连接.         windows 身份验证相对于混合模式更加安全,使用本连接模式时候,sql不推断sapassword.而仅依据用户的windows权 ...

  5. 在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client

    在PHP应用中简化OAuth2.0身份验证集成:OAuth 2.0 Client   阅读目录 验证代码流程 Refreshing a Token Built-In Providers 这个包能够让你 ...

  6. [ASP.NET]SQL Server 连接字符串和身份验证

    SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开. PropertyName1=Value1; Property ...

  7. SQL Server 连接字符串和身份验证详解

    SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开.          PropertyName1=Value1; ...

  8. SQL Server 连接字符串和身份验证

    SQL Server .NET Data Provider 连接字符串包含一个由一些属性名/值对组成的集合.每一个属性/值对都由分号隔开.         PropertyName1=Value1;P ...

  9. 远程连接身份验证错误,又找不到加密Oracle修正

    远程连接服务器出现了错误,错误信息为:远程连接身份验证错误,又找不到加密Oracle修正. 服务器系统:Windows Server2016 客户端系统:Windows10家庭版和专业版   出错原因 ...

  10. 20180726 - Windows 10 Pro 下远程桌面连接提示“出现身份验证错误”

    问题:Windows 10 Pro 下远程桌面连接提示“出现身份验证错误” [Window Title]远程桌面连接 [Content]出现身份验证错误.要求的函数不受支持 远程计算机: 192.16 ...

随机推荐

  1. ASP.NET Core分布式项目实战(业务介绍,架构设计,oAuth2,IdentityServer4)--学习笔记

    任务4:第一章计划与目录 敏捷产品开发流程 原型预览与业务介绍 整体架构设计 API 接口设计 / swagger Identity Server 4 搭建登录 账号 API 实现 配置中心 任务5: ...

  2. .NET 大数据实时计算--学习笔记

    摘要 纯 .Net 自研大数据实时计算平台,在中通快递服务数百亿包裹,处理数据万亿计!将分享大数据如何落地以及设计思路,技术重难点. 目录 背景介绍 计算平台架构 项目实战 背景介绍 计算平台架构 分 ...

  3. Hadoop-基础知识面试题

    1.Hadoop集群的最主要瓶颈 磁盘IO 2.Hadoop三大组件 (1).HDFS HDFS(Hadoop Distributed File System)是 Hadoop 项目的核心子项目,主要 ...

  4. Java并发编程-CompletableFuture(下)

    大家好,我是小高先生,书接上文,我们继续来学习CompletableFuture.上文我们讲了基础装Future是如何升级为神装CompletableFuture以及如何购买CompletableFu ...

  5. STM32 printf 方法重定向到串口UART

    在嵌入式系统中调试代码是很麻烦的一件事, 如果能方便地输出调试信息(与调试者交互), 能使极大加快问题排查的过程. 串口在嵌入式领域是一个比较重要的通讯接口. 因为没有显示设备, 在单片机的程序里调用 ...

  6. 使用JS访问本地数据库

    1 前言 有时候,数据业务比较大,比如查询百万级的数据,如果使用JSP查询数据库,JSP的返回结果一般放在域名后面返回给客户端,而返回结果的长度是有限制的,数据过长可能会丢失部分数据:另一方面数据量大 ...

  7. Kafka集群搭建与SpringBoot项目集成

    本篇文章的目的是帮助Kafka初学者快速搭建一个Kafka集群,以及怎么在SpringBoot项目中使用Kafka. kafka集群环境包地址:https://pan.baidu.com/s/1Mar ...

  8. IDA 常用快捷键记录

    常用快捷键1 1.切换文本视图与图表视图 空格键 2.返回上一个操作地址 ESC 3.搜索地址和符号 G 4.对符号进行重命名 N 5.常规注释 冒号键 6.可重复注释 分号键 7.添加标签 Alt+ ...

  9. Qt+MySql开发笔记:Qt5.9.3的mingw32版本编译MySql8版本驱动并Demo连接数据库测试

    前言   之前特定的mysql版本msvc版本已经调通了,但是为了更好的跨平台,所以选择用mingw32版本,于是需要编译mysql驱动的mingw32版本的驱动库,以便提供给qt连接mysql使用. ...

  10. Java JVM——4.程序计数器

    简介 JVM中的程序计数寄存器(Program Counter Register),Register的命名源于CPU的寄存器,寄存器存储指令相关的现场信息,CPU只有把数据装载到寄存器才能够运行. 这 ...