当前位置: 首页 > 知识库问答 >
问题:

Office 365/EWS使用OAuth身份验证:访问群体声明值无效

谢承颜
2023-03-14

我已经在Azure AD中注册了一个应用程序
我已经从那里使用了ClientID
我生成了一个应用程序秘密/密钥
我已经将“完全访问用户邮箱(预览)”权限委派给了该应用程序。

我正在使用ADAL检索访问令牌,如下所示:

var authority = "https://login.windows.net/<tenant>"
var authContext = new AuthenticationContext(authority);
var clientCredential = new ClientCredential("<clientId>", "<appKey>");
result = OAuthTokenManager.authContext.AcquireToken("<my ResourceID>", clientCredential);

我确实拿回了访问令牌。解码值为:

{
 "typ": "JWT",
 "alg": "RS256",
 "x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}.
{
 "aud": "<my resource ID>",
 "iss": "https://sts.windows.net/2d1f889d-7930-4ef6-9f87-ef096d91ac47/",
 "nbf": 1403253608,
 "exp": 1403296808,
 "sub": "bdb0baf9-29ca-4a43-b9f8-d81ca2ae83bd",
 "appid": "<my app ID>",
 "oid": "bdb0baf9-29ca-4a43-b9f8-d81ca2ae83bd",
 "tid": "2d1f889d-7930-4ef6-9f87-ef096d91ac47",
 "idp": "https://sts.windows.net/2d1f889d-7930-4ef6-9f87-ef096d91ac47/"
}.
[signature] 
var service = new ExchangeService(ExchangeVersion.Exchange2013_SP1);
var credentials = new OAuthCredentials(token);
service.Credentials = credentials;
service.Url = new Uri("https://outlook.office365.com/EWS/Exchange.asmx");
service.ImpersonatedUserId = new ImpersonatedUserId(ConnectingIdType.SmtpAddress, "<smtp address of o365 mailbox>");
Folder inbox = Folder.Bind(service, WellKnownFolderName.Inbox);
The audience claim value is invalid <my resource ID>
ACS50001: Relying party with identifier 'https://outlook.office365.com/' was not found.

租户确实有Exchange订阅,并且它对邮箱具有完全访问权限。

共有1个答案

陆绍辉
2023-03-14

啊好吧。对于服务类型的应用程序,您需要使用一个可以模拟用户的服务帐户。有关详细信息,请参阅此MSDN主题。拥有该帐户后,您将希望通过OAuth身份验证为该服务帐户,然后根据需要模拟您的用户。

对于本机应用程序,您不能使用应用程序机密进行身份验证。因此您需要执行以下操作:

AuthenticationResult result = authContext.AcquireToken("https://outlook.office365.com", clientId, new Uri(callbackUri), PromptBehavior.Auto);

其中clientid是您在Azure注册中的客户端ID,callbackuri是您在Azure中注册应用程序时指定的重定向URI。这将导致显示一个提示窗口,但如果保存令牌和刷新令牌并使用它们来刷新,则应避免任何进一步的提示。返回的令牌应该类似于:

{
 "typ": "JWT",
 "alg": "RS256",
 "x5t": "kriMPdmBvx68skT8-mPAB3BseeA"
}.
{
 "aud": "https://outlook.office365.com",
 "iss": "https://sts.windows.net/9e4563d1-423e-493b-bdc5-9a98fe2e24d9/",
 "iat": 1403706230,
 "nbf": 1403706230,
 "exp": 1403710130,
 "ver": "1.0",
 "tid": "9e4563d1-423e-493b-bdc5-9a98fe2e24d9",
 "amr": [
  "pwd"
 ],
 "oid": "4a6e20e6-9711-4ca1-888b-34e63f65f897",
 "upn": "impersonationaccount@contoso.com",
 "unique_name": "impersonationaccount@contoso.com",
 "sub": "Pp3JW2dfYELMUBjGjUIZLarT4diOkkKZ1OJPVunzAYE",
 "puid": "100300008A9245F4",
 "family_name": "Account",
 "given_name": "Application",
 "appid": "<your app id>",
 "appidacr": "0",
 "scp": "user_impersonation",
 "acr": "1"
}.
[signature]
 类似资料:
  • 我一直在尝试使用OAuth将Office 365 Exchange服务集成到web应用程序中。我们已经为内部部署进行了集成,该集成可与基本[用户名:密码]身份验证一起使用https://outlook.office365.com/EWS/Exchange.asmx 授权使用:https://login.microsoftonline.com//oauth2/authorize?response_t

  • 我正在使用预装的Visual Studio解决方案开发我的首批OAuth解决方案之一。 不过,同时我也希望我的服务器应用程序拥有“完全访问权限”。他们需要能够获得列表增加多个用户,删除东西等等。 下面是我的问题,我认为这些问题可以很容易地一起回答: 如何管理两个短期令牌(承载令牌?)连同永久令牌(API令牌?) 我在访问级别上有何不同,因此某些方法需要永久令牌? 在同一方法中,我在访问级别上有何不

  • 根据developer.yahoo.com/mail/和IMAP的回复: Yahoo Mail可以通过IMAP使用OAuth(2)身份验证访问。 我在https://developer.yahoo.com/apps/上注册了我的应用程序,所以我得到了客户端ID和客户端机密。我没有找到任何与邮件相关的作用域(API权限)。然而,我选择了所有API权限,这是在我注册我的应用程序时提出的。 我尝试实现O

  • 问题内容: 我一直在研究一个简单的API示例,即带有身份验证的ServiceStack Hello World示例的修改版本。概念验证的目的是创建一个RESTful API,该API包含要求身份验证的服务,这些服务完全可以通过Ajax从多个不同的Web项目访问。 我已经阅读了有关Wiki的认证和授权以及实现CORS的实现,(很多,结果[抱歉,没有足够的信誉指向相关链接])。此时,我的Hello服务

  • 我使用以下方法注册了身份验证器:

  • 当我将令牌粘贴到这个网站上的JWT调试器中时:https://JWT.io/,我得到了一些信息(stable_sid,sid,sub,idp,ver,iss,aud,exp,nbf),但我似乎无法得到其中的组声明。 我在Azured AD中添加了读取Microsoft graph和Azure active directory组所需的权限,但它没有改变令牌中的任何内容。 我缺少什么来获取用户组?