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

EWS:“远程服务器返回错误(401)未授权”

朱越
2023-03-14

我试图从当前上下文中的所有项目中找到一个项目,但我似乎总是收到以下错误消息:

请求失败。远程服务器返回错误:(401)未授权。

首先,我设置了访问交换服务的所有内容:

var signInUserId = ClaimsPrincipal.Current.FindFirst(ClaimTypes.NameIdentifier).Value;
var userObjectId = ClaimsPrincipal.Current.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier").Value;

AuthenticationResult authenticationResult = null;
AuthenticationContext authenticationContext = new AuthenticationContext(
            SettingsHelper.Authority, new model.ADALTokenCache(signInUserId));

authenticationResult = authenticationContext.AcquireToken(
            SettingsHelper.ServerName, 
            new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret));

ExchangeService exchange = new ExchangeService(ExchangeVersion.Exchange2013);
exchange.Url = new Uri(SettingsHelper.ServerName + "ews/exchange.asmx");
exchange.TraceEnabled = true;
exchange.TraceFlags = TraceFlags.All;
exchange.Credentials = new OAuthCredentials(authenticationResult.AccessToken);

然后我定义要接收的项目(按ID):

ItemView view = new ItemView(5);
view.PropertySet = new PropertySet(BasePropertySet.IdOnly);

var tempId = id.Replace('-', '/').Replace('_', '+');
SearchFilter.IsEqualTo searchid = new SearchFilter.IsEqualTo(ItemSchema.Id, tempId);

最后但同样重要的是,我尝试在我的物品中搜索这个物品:

FindItemsResults<Microsoft.Exchange.WebServices.Data.Item> results = exchange.FindItems(WellKnownFolderName.Inbox, searchid, view);

这就是我的错误发生的地方。我尝试过各种其他的方法,但无论我做什么,我都会被授权。

有人可以以正确的方式指导我,以解决这个问题吗?

编辑

我收到了来自以下地址的访问令牌:

authenticationResult = authenticationContext.AcquireToken(
            SettingsHelper.ServerName, 
            new ClientCredential(SettingsHelper.ClientId, SettingsHelper.ClientSecret));

正如我通过调试代码所看到的。

虽然没有刷新令牌,我不知道这是否有话要说?

编辑

我刚刚设法一路调试交易所。响应标题在那里我看到了这个:

访问令牌是使用太弱的身份验证方法获取的,该方法不允许对此应用程序进行访问。呈现的身份验证强度为1,所需为2

我解码了JWT,因为这是我的结果:

{
  typ: "JWT",
  alg: "RS256",
  x5t: "MnC_VZcATfM5pOYiJHMba9goEKY",
  kid: "MnC_VZcATfM5pOYiJHMba9goEKY"
}.
{
  aud: "https://outlook.office365.com/",
  iss: "https://sts.windows.net/d35f5b06-f051-458d-92cc-2b8096b4b78b/",
  iat: 1445416753,
  nbf: 1445416753,
  exp: 1445420653,
  ver: "1.0",
  tid: "d35f5b06-f051-458d-92cc-2b8096b4b78b",
  oid: "c5da9088-987d-463f-a730-2706f23f3cc6",
  sub: "c5da9088-987d-463f-a730-2706f23f3cc6",
  idp: "https://sts.windows.net/d35f5b06-f051-458d-92cc-2b8096b4b78b/",
  appid: "70af108f-5c8c-4ee4-a40f-ab0b6f5922e0",
  appidacr: "1"
}.
[signature]

何去何从?

共有1个答案

厉令
2023-03-14

我过去使用 EWS 时已经收到此错误“访问令牌是使用太弱的身份验证方法获取的,不允许访问此应用程序。呈现的身份验证强度为 1,所需为 2”

您需要做的是使用证书强制您的身份验证。

AuthenticationContext authContext = new AuthenticationContext(authority);

exchangeService.Credentials = new OAuthCredentials(authContext.AcquireToken("https://outlook.office365.com", new ClientAssertionCertificate(ConfigurationManager.AppSettings["ida:ClientId"], certificate)).AccessToken);

关键部分是定义一个新的客户端断言证书作为客户端断言。

您还必须修改Azure Active Directory应用程序的清单。

查看此参考(关于“为应用程序配置X.509公共证书”的部分):https://msdn.microsoft.com/en-us/office/office365/howto/building-service-apps-in-office-365

 类似资料:
  • 问题内容: 我正在使用GCM服务从服务器推送信息。如果我使用浏览器密钥,它将成功消息显示为: {“ multicast_id”:4849013215736515938,“ success”:1,“ failure”:0,“ canonical_ids”:0,“ results”:[{“ message_id”:“ 0: 1348742583011905%2adac3a0f9fd7ecd“}]},

  • 我使用spring ide在本地机器嵌入式apache服务器上部署了spring boot web应用程序,并访问了一个带有错误令牌的url,在这种情况下,它会返回未经授权的访问错误401和托管异常处理抛出的特定错误消息,而如果我在独立但相同的apache服务器上部署相同的应用程序,它会给我500个内部服务器错误而不是401或任何其他服务器端错误。 我捕获的日志只有以下一行不同: 下面是我用来处理

  • 我正在使用Twitter OAuth对用户进行身份验证,并在我的网站上显示用户的推文。 以下是用于API的一些常量: 公共常量字符串请求_令牌=”https://api.twitter.com/oauth/request_token“public const string AUTHORIZE=”https://api.twitter.com/oauth/authorize“public const

  • 我正在试图了解远程服务器返回错误的原因:(409)冲突 我通过获取租约、附加文本和打破租约来给AppendBlob写行,就像这样。错误只是偶尔发生,所以我很好奇什么情况会导致它发生。我的怀疑是,如果多个用户命中该代码执行的endpoint,并且以某种方式同时调用获取租赁,可能会发生一些事情。 失败的方法是Microsoft。WindowsAzure.存储。共享。协议。http://http://P

  • 所以,我试图用Tweepy喜欢一个推文,但是这个错误正在发生: 有什么想法吗?

  • 我的代码:GoogleCredential凭据 credential.refreshToken() 错误日志: 创建服务号的步骤: 我在凭据中的oauth 2.0中创建了一个Web应用程序 然后我用客户端ID创建了一个服务号 现在我正在使用这个服务号和从它生成的p12证书来验证和创建Google凭据的对象 一旦刷新令牌,我就给了我401例外。 在这种情况下,任何帮助都会受到感激