通过非Microsoft用户凭据获取访问令牌而不提示

时间:2017-10-17 09:49:44

标签: c# azure-active-directory

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

它有助于我提示: 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}"

    错误说明:&#34; AADSTS50034:要登录此应用程序,必须将帐户添加到 tenantId 目录。

  3. 我使用的用户是我试图登录的租户,并且它起作用了。 我想知道为什么它不能用于其他两种方式。

    由于

1 个答案:

答案 0 :(得分:0)

这里的问题可能只是&#34;用户名&#34;对于来宾帐户不是&#34; xxx@outlook.com"。当在AAD中从MSA帐户(如@ outlook.com或@ live.com)创建访客帐户时,会生成一个具有唯一用户主体名称的新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"
    },

请注意“奇怪的”&#39;格式化userPrincipalName。您可以看到这是为我的@ live.com帐户创建的访客帐户。我通过在我的租户中拨打以下电话来获得此信息:

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

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

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

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