【问题标题】:Cant authenticate user silently with ADAL for Office 365 REST API on ASP.NET MVC无法在 ASP.NET MVC 上使用 ADAL for Office 365 REST API 对用户进行静默身份验证
【发布时间】:2016-05-20 00:48:54
【问题描述】:

所以我正在尝试为我们的办公室身份验证实现持久令牌,这样用户就不必在每次进入新会话时都登录办公室。我目前必须验证用户的代码如下。

string authority = "https://login.microsoftonline.com/common";
var tokenCache = new ADALTokenCache(User.Identity.GetUserId());
AuthenticationContext authContext = new AuthenticationContext(authority, tokenCache );
var token = authContext.AcquireTokenSilentAsync(scopes, clientId, new UserIdentifier(userId, UserIdentifierType.RequiredDisplayableId));

但是到目前为止我尝试过的一切都给了我下面的错误

例外是:"Failed to acquire token silently. Call method AcquireToken"

我首先获取token的方法如下

string authority = "https://login.microsoftonline.com/common";
var fileCache = new ADALTokenCache(User.Identity.GetUserId());
AuthenticationContext authContext = new AuthenticationContext(authority, fileCache);
var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(
                authCode, redirectUri, credential, scopes);

我使用的令牌缓存是一个数据库实现,它是我从一个我再也找不到的教程制作的,如果我看数据库,我可以看到当AcquireTokenByAuthorizationCodeAsync 被调用时,新的令牌被插入到数据库中。

更新:
这是我在调用AcquireTokenByAuthorizationCodeAsync 时从 authResult 得到的结果

我已将 Virbonet 的答案标记为解决方案,但我没有修复它,但他确实向我解释了我哪里出错了

【问题讨论】:

  • 您从哪里获得 authCode?​​span>

标签: c# asp.net office365 adal office365api


【解决方案1】:

AcquireTokenSilent 在权限中传递 /common 时无法工作。使用“common”相当于声明您不知道用户来自哪个租户,因此 ADAL 无法从特定租户返回缓存令牌 - 需要用户交互来确定应该使用哪个租户。 如果你想调用AcquireTokenSilent,你需要用传入用户的确切租户初始化权限,如"https://login.microsoftonline.com/"+tenantID这里tenantID是当前ClaimsPrincipal的租户ID。

【讨论】:

  • 啊,这很有道理,谢谢。浏览我从未见过的教程。但是,对于我从哪里获得当前用户的tennantID,我仍然有点茫然,你能从哪里获得它或有关此事的一些资源吗?
  • 尝试字符串tenantID = ClaimsPrincipal.Current.FindFirst("schemas.microsoft.com/identity/claims/tenantid").Value;
  • 这似乎不起作用,如果它有助于我使用几乎开箱即用的 ASP.NET Identity 2 Auth 并且不要在任何地方设置用户 TennantID,Office 365 API将它提供给我可能需要将其分配给当前用户的地方?
  • 如果您没有使用 azure ad 登录而是使用了 aspnet 身份,您必须记住自己代码中的租户 ID。您应该在第一次调用 acquiretokenbyauthorizationtoken 的 authenticationresult 中找到它
  • 嗯,谢谢,但是当我调用AcquireTokenByAuthorizationCodeAsync 时,返回的tennantID 为空。我已经用返回的身份验证结果的 SS 更新了我的帖子
【解决方案2】:

这是您需要使用的函数调用:AcquireTokenByAuthorizationCode() 但不是 AcquireTokenSilent()

希望这会有所帮助。

【讨论】:

  • 对 AcquireTokenSilent 的调用是正确的,因为 Toxicable 之前已经通过代码获取了令牌 - 但正如我在回答中详述的那样,他的权限设置不能与 AcquireTokenSilent 一起使用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 1970-01-01
  • 2016-06-04
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多