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

转载:
https://mp.weixin.qq.com/s?__biz=MzU0MzUxMzU2NA==&mid=2247485862&idx=1&sn=5af9daf826678289168a4fe014dc10b7&chksm=fb0b0715cc7c8e03f3ca1acd73a8a3092a3b7bb7cba60bc40ae2e009a54c7c27857d6ae0c8fd&mpshare=1&scene=2&srcid=070919TLMEqt54Jyz0vutc1B&sharer_sharetime=1657380028805&sharer_shareid=43168720efd86200ea68376ba733532c#rd
 
 
Original Robin Dai Office365云服务技术支持

Office365云服务技术支持

Weixin ID VNET_O365Support

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

2022-07-09 09:00 Posted on 北京

收录于合集
 

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

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

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

而在诸多实际的生产场景中,由于历史版本的原因,很多开发者在调用 EWS 时一直使用基本身份验证,这无疑在之后停用基本身份验证后,会造成认证失败而无法使用的情况。

针对这种情况,今天就向大家说明一下,如何使用现代身份验证(OAuth) 调用 EWS 服务。

OAuth 是什么

OAuth 并不是 API 或者服务,而是一种对于授权认证的公开标准。这个标准也并不是由微软制定的,所有人都可以使用 OAuth 标准来实现自己系统的认证过程。目前使用最广泛的 OAuth 标准是 OAuth 2.0 版本,Azure Active Directory 也是使用的 OAuth 2.0 版本的标准,因此你会在任何我们的登录请求中看到“oauth2”的部分:

Azure AD 中认证终结点的截图

OAuth通过发送 HTTP 请求的方式获取凭据令牌(Token),相对于基本身份验证中直接使用用户名和密码,OAuth 认证标准更为安全。在 Azure AD 中,我们采用 JWT 格式的令牌。JWT 格式令牌通过三个部分组成,头信息、负载信息、签名信息。

  • 头信息部分主要声明类型和加密算法

  • 负载信息部分存放了令牌的接收方、生效时间、过期时间、用户信息、权限范围等主要说明信息

  • 签名信息部分是对令牌进行加密验证的部分

图为一个解析过的 jwt 格式的访问令牌内容

在 Azure AD 中,获取 OAuth 令牌有多种方法,在这里不做一一介绍,感兴趣的朋友可以访问以下二维码在官方文档中学习:

长按识别二维码,学习如何在 Azure AD 中通过 Code 来获取令牌,

旁边的目录中还有更多授权方式哦~

如何获取一个 EWS 可以使用的 OAuth 令牌

简单介绍过了 OAuth,下面说说如何获取一个 EWS 服务可用的 OAuth 令牌。

想要在 Azure AD 认证平台中获取一个有效的令牌,首先你需要自己注册一个应用。之所以要自己注册应用,是因为诸如 Exchange Online、SharePoint Online 等被称之为微软的第一方应用,你自己的程序无法调用第一方应用的令牌。

注册应用请遵循以下步骤(以 世纪互联 版本为例):

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

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

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

  • 在API权限中添加权限:

    • 点击添加权限

    • 点击我的组织使用的 API

    • 找到 Office 365 Exchange Online 并点击

    • 选择委托的权限中的full_access_as_user 以及应用程序权限中的 full_access_as_app 并保存。

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

准备工作大功告成。下面我们就来申请一个EWS可以使用的令牌。

之前我们说过,OAuth 令牌通过 HTTP 请求的方式获取,具体的请求内容如下(以无用户参与的客户端流为例,请将自己的租户 ID、注册应用 ID 和客户端密码替换示例中的{tenant ID}、{App ID}和{Client Secret}。):

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}

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

&client_secret={Client Secret}

&grant_type=client_credential

cURL

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

您也可以使用 Microsoft.Identity.Client 库来获取令牌:

App.config 文件:

Xml

<?xml version="1.0" encoding="utf-8" ?>

<configuration>

<appSettings>

<add key="appId" value="{App ID}" />

<add key="tenantId" value="{tenant ID}"/

<add key="clientSecret" value="{Client Secret}"/>

</appSettings>

</configuration>

获取令牌:

C#

var cca = ConfidentialClientApplicationBuilder

.Create(ConfigurationManager.AppSettings["appId"])

.WithClientSecret(ConfigurationManager.AppSettings["clientSecret"])

.WithTenantId(ConfigurationManager.AppSettings["tenantId"])

//仅在 21V 版本中,添加下一行代码

.WithAuthority(AzureCloudInstance.AzureChina, ConfigurationManager.AppSettings["tenantId"])

.Build();

var ewsScopes = new string[] { "https://partner.outlook.cn/.default" };

var authResult = await

cca.AcquireTokenForClient(ewsScopes).ExecuteAsync();

通过 OAuth 令牌调用 EWS

现在,我们就可以通过 OAuth 令牌凭据来调用 EWS 服务了:

C#

var ewsClient = new ExchangeService();

ewsClient.Url = new Uri("https://partner.outlook.cn/EWS/Exchange.asmx");

ewsClient.Credentials = new OAuthCredentials(authResult.AccessToken);

ewsClient.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "user@abc.com");

下面的内容是一个完整的示例(获取日历信息):

C#

using Microsoft.Exchange.WebServices.Data;

using Microsoft.Identity.Client;

using System;

using System.Configuration;

namespace EwsOAuth

{

class Program

{

static async System.Threading.Tasks.Task Main(string[] args)

{

// Using Microsoft.Identity.Client 4.22.0

var cca = ConfidentialClientApplicationBuilder

.Create(ConfigurationManager.AppSettings["appId"])

.WithClientSecret(ConfigurationManager.AppSettings["clientSecret"])

.WithTenantId(ConfigurationManager.AppSettings["tenantId"])

// Use the next line of code only in a 21V environment

.WithAuthority(AzureCloudInstance.AzureChina, ConfigurationManager.AppSettings["tenantId"])

.Build();

//the permission scope required for EWS access

var ewsScopes = new string[] { "https://partner.outlook.cn/.default" };

try

{

//make the token request

var authResult = await cca.AcquireTokenForClient(ewsScopes).ExecuteAsync();

// Configure the ExchangeService with the access token

var ewsClient = new ExchangeService();

ewsClient.Url = new Uri("https://partner.outlook.cn/EWS/Exchange.asmx");

ewsClient.Credentials = new OAuthCredentials(authResult.AccessToken);

ewsClient.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "S02@ms10.online");

//Include x-anchormailbox header

ewsClient.HttpHeaders.Add("X-AnchorMailbox", "S02@ms10.online");

// Make an EWS call

DateTime endDate = DateTime.Now;

DateTime startDate = endDate.AddDays(-30);

CalendarFolder calendar = CalendarFolder.Bind(ewsClient, WellKnownFolderName.Calendar, new PropertySet());

CalendarView cView = new CalendarView(startDate, endDate);

cView.PropertySet = new PropertySet(AppointmentSchema.Subject, AppointmentSchema.Start, AppointmentSchema.End);

FindItemsResults<Appointment> appointments = calendar.FindAppointments(cView);

Console.WriteLine("\nThe first " + " appointments on your calendar from " + startDate.Date.ToShortDateString() +

" to " + endDate.Date.ToShortDateString() + " are: \n");

foreach (Appointment a in appointments)

{

Console.Write("Subject: " + a.Subject.ToString() + " ");

Console.Write("Start: " + a.Start.ToString() + " ");

Console.Write("End: " + a.End.ToString());

Console.WriteLine();

}

}

catch (MsalException ex)

{

Console.WriteLine($"Error acquiring access token: {ex}");

}

catch (Exception ex)

{

Console.WriteLine($"Error: {ex}");

}

if (System.Diagnostics.Debugger.IsAttached)

{

Console.WriteLine("Hit any key to exit...");

Console.ReadKey();

}

}

}

}

综上,我们呼吁还在使用基本身份验证方式访问 EWS 服务的客户,尽快参考此文档更换为现代身份验证(OAuth)。

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

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

使用现代身份验证(OAuth)调用 EWS 服务的更多相关文章

  1. android下身份验证方式调用webservice

    在企业开发领域,webservice还是经常被用到的服务体系,因为他对安全事务支持都比较好. 有时候,我们就需要在android下调用后端的webservice服务,因为在内部网络环境下,所有需要ba ...

  2. 关于WEB Service&WCF&WebApi实现身份验证之WEB Service篇

    在这个WEB API横行的时代,讲WEB Service技术却实显得有些过时了,过时的技术并不代表无用武之地,有些地方也还是可以继续用他的,我之所以会讲解WEB Service,源于我最近面试时被问到 ...

  3. C# 实现身份验证之WEB Service篇

    在这个WEB API横行的时代,讲WEB Service技术却实显得有些过时了,过时的技术并不代表无用武之地,有些地方也还是可以继续用他的,我之所以会讲解WEB Service,源于我最近面试时被问到 ...

  4. [转]Reporting Services 中的身份验证类型

    本文转自:https://docs.microsoft.com/zh-cn/previous-versions/sql/sql-server-2008/cc281310%28v%3dsql.100%2 ...

  5. IIS 身份验证

    IIS 支持以下身份验证模式: 匿名.如果不需要对客户端进行身份验证(或者使用自定义身份验证机制,如窗体身份验证),则可将 IIS 配置为允许匿名访问.在该事件中,IIS 创建一个 Windows 令 ...

  6. WCF身份验证一:消息安全模式之<Certificate>身份验证

    消息安全模式的证书身份验证方式,基于WSHttpBinding绑定协议的实现过程.主要内容:基本概念,然后是制作证书.服务端配置.客户端配置.总结.这里应该和Transport传输安全模式之证书身份验 ...

  7. 基于 Token 的身份验证方法

    使用基于 Token 的身份验证方法,在服务端不需要存储用户的登录记录.大概的流程是这样的: 客户端使用用户名跟密码请求登录 服务端收到请求,去验证用户名与密码 验证成功后,服务端会签发一个 Toke ...

  8. (转)基于 Token 的身份验证

    原文:https://ninghao.net/blog/2834 最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,G ...

  9. 基于 Token 的身份验证:JSON Web Token(附:Node.js 项目)

    最近了解下基于 Token 的身份验证,跟大伙分享下.很多大型网站也都在用,比如 Facebook,Twitter,Google+,Github 等等,比起传统的身份验证方法,Token 扩展性更强, ...

  10. 基于token的身份验证JWT

    传统身份验证的方法 HTTP 是一种没有状态的协议,也就是它并不知道是谁是访问应用.这里我们把用户看成是客户端,客户端使用用户名还有密码通过了身份验证,不过下回这个客户端再发送请求时候,还得再验证一下 ...

随机推荐

  1. .NET 云原生架构师训练营(模块二 基础巩固 HTTP管道与中间件)--学习笔记

    2.3.2 Web API -- HTTP管道与中间件 管道 中间件 ASP.NET Core 中间件:https://docs.microsoft.com/zh-cn/aspnet/core/fun ...

  2. ASP.NET Core分布式项目实战(客户端集成IdentityServer)--学习笔记

    任务9:客户端集成IdentityServer 新建 API 项目 dotnet new webapi --name ClientCredentialApi 控制器添加验证 using Microso ...

  3. 山东职业竞赛wp2023(arm、cpython)

    pwn2 return2libc,白给 from evilblade import * context(os='linux', arch='amd64') context(os='linux', ar ...

  4. CF510D Fox And Jumping

    题目链接 题目 见链接. 题解 方法一 知识点:背包dp,STL. 题目意思是让我们判断能否从这些数中选出一些数使得选的数公共gcd为 \(1\),如果可以输出最小花费. 一眼背包dp,但要map超大 ...

  5. Linux常用的20个命令(上)

    无论你是后端程序员还是前端程序员,都避免不了和Linux打交道.Linux的命令有很多,这里仅介绍常用的20个,方便快速查看,也欢迎大家作补充. 1.mkdir 命令 make directories ...

  6. JavaScript 的灵异事件之一

    场景 在做项目的时候需要用到Ajax 做多次的异步处理数据, 三次Ajax:A --ok--> B --ok--> C 在入参数据相同的情况下,做了两论这个操作,但发现没有发送 A 的 A ...

  7. 全流程点云机器学习(一)使用CloudCompare自制sharpNet数据集

    前言 这不是高支模项目需要嘛,他们用传统算法切那个横杆竖杆流程复杂耗时很长,所以想能不能用机器学习完成这些工作,所以我就来整这个工作了. 工欲善其事,必先利其器,在正式开始之前,我们先要搞懂如何切分数 ...

  8. Java设计模式-建造者模式Builder

    介绍 建造者模式(Builder Pattern) 又叫生成器模式,是一种对象构建模式.它可以 将复杂对象的建造过程抽象出来(抽象类别),使这个抽象过程的不同实现方 法可以构造出不同表现(属性)的对象 ...

  9. 初级算法 - C++反转链表

    顾名思义, 就是将链表的所有结点反转. 解释见:[剑指offer]反转链表,C++实现(链表) 代码: #include <iostream> struct NodeList { int ...

  10. Go微服务框架go-kratos实战学习07:consul 作为服务注册和发现中心

    一.Consul 简介 consul 是什么 HashiCorp Consul 是一种服务网络解决方案,它能够管理服务之间以及跨本地和多云环境和运行时的安全网络连接.Consul 它能提供服务发现.服 ...