【问题标题】:Get access token by non-Microsoft user credentials without prompt通过非 Microsoft 用户凭据获取访问令牌,无需提示
【发布时间】:2023-04-08 20:43:01
【问题描述】:

我正在尝试为非微软用户无提示获取访问令牌。

它在提示下对我有用: authenticationContext.AcquireToken(resource, clientId, new Uri(uri), PromptBehavior.Always);

但没有提示,它不起作用。我尝试了以下两种方法:

  1. var authContext = new AuthenticationContext(Authority); var userCredential = new UserCredential(username, password); var token = authContext.AcquireToken(resource, clientId, userCredential);

    ActiveDirectory v3 异常:访问 WS 元数据交换失败。

    ActiveDirectory v2:序列不包含任何元素。

  2. new HttpRequestMessage(HttpMethod.Post, "https://login.microsoftonline.com/<tenantId>/oauth2/token");

    与:

    $"grant_type=password&resource={resource}&client_id= {clientId}&username={userName}&password={password}"

    错误描述:“AADSTS50034:要登录此应用程序,必须将帐户添加到 tenantId 目录。

我使用的用户在我尝试登录的租户中,并且它使用提示符。 我想知道为什么它不适用于其他两种方式。

谢谢

【问题讨论】:

  • “非微软”用户是什么意思?你想通过没有提示来完成什么?
  • 例如:xxx@outlook.com。对于像 xxx@microsoft.com 这样的 Microsoft 用户,它可以工作。 (他们都在同一个租户中)。我想动态传递用户凭据(无用户操作)
  • 如何将 xxx@outlook.com 添加到租户中?作为访客帐户?或外部帐户?您使用的是由 Azure 门户创建的标准 AAD 应用程序吗?
  • 访客帐号。是的 - Azure 门户创建的标准 AAD 应用程序

标签: c# azure-active-directory


【解决方案1】:

这里的问题可能只是访客帐户的“用户名”不是“xxx@outlook.com”。当从 MSA 帐户(如 @outlook.com 或 @live.com)在 AAD 中创建来宾帐户时,会生成一个具有唯一用户主体名称的新 AAD 用户,该名称如下所示:

    {
        "id": "d3ce3d26-xxx-xxx-xxx-5157f5308f04",
        "businessPhones": [],
        "displayName": "Shawn Tabrizi",
        "givenName": "Shawn",
        "jobTitle": null,
        "mail": null,
        "mobilePhone": null,
        "officeLocation": null,
        "preferredLanguage": null,
        "surname": "Tabrizi",
        "userPrincipalName": "shawntabrizi_live.com#EXT#@shawntest.onmicrosoft.com"
    },

注意userPrincipalName 的“奇怪”格式。您可以看到这是为我的@live.com 帐户创建的访客帐户。我通过在我的租户中拨打以下电话得到了这个:

GET https://graph.microsoft.com/v1.0/users

这里的解决方案可能是使用 userPrincipalName 值填充用户名字段,这是 AAD 知道并期望作为用户的唯一 ID,而不是原始 MSA 用户名。

下一个自然问题是为什么 xxx@outlook.com 帐户可以通过交互式登录体验登录?好吧,该页面中可能发生了很多“魔术”,无法使用 Azure Active Directory 中的资源所有者密码凭据授予进行复制。

如果这能解决问题,请告诉我。

【讨论】:

  • 我只有unique_name,试过了,但是失败了。
  • 你是什么意思'unique_name'?这个价值从何而来?
  • 谢谢肖恩!唯一名称 - live.com#xxx@outlook.com。 AFAIK,来宾用户没有 UPN。我在登录请求中看到了 unique_name。
  • 嗨 Michal,我最近玩了一些 GUEST 用户的东西,我可以确认您为来宾用户获得的令牌不包含 upn 声明,而是 unique_name 声明.如果您查询用户对象,例如使用/me 端点,您将在响应中看到真正的userPrincipalName"userPrincipalName":"shtabriz_microsoft.com#EXT#@shawntest.onmicrosoft.com" 或类似的。我相信(尚未测试)您应该将此标识符用于资源所有者密码凭据授予。
猜你喜欢
  • 1970-01-01
  • 2016-07-09
  • 2019-11-09
  • 1970-01-01
  • 1970-01-01
  • 2018-07-09
  • 1970-01-01
  • 2015-07-12
  • 2013-10-23
相关资源
最近更新 更多