18

我正在为 Azure AD b2c 寻找一种通过用户名/密码以无头方式对用户进行身份验证的方法。Azure AD b2c 很棒,但我们认为登录重定向可能会导致客户混淆(有时甚至会被某些浏览器阻止)。此外,我们希望完全控制客户的 UX 体验。

我研究了 ADAL 和 Graph API,但还没有发现任何东西。

吉娜

4

6 回答 6

10

如此处所述,您可以将 Azure AD 应用程序用于服务帐户的客户端凭据流。它不是最佳的,但它有效。

  1. 为 Web API定义 Azure AD 应用程序
  2. 为每个服务帐户定义一个 Azure AD 应用程序
  3. 配置 Web API 以接受来自 B2C 租户和 Azure AD 的令牌
  4. 针对 Web API 的服务帐户 AD 应用请求访问令牌

注意:请务必在您的 B2C 租户下创建 Azure AD 应用程序。


从 C# 获取访问令牌的代码片段

using (var httpClient = new HttpClient())
{
    httpClient.BaseAddress = new Uri("https://login.microsoftonline.com");

    var content = new FormUrlEncodedContent(new[]
    {
          new KeyValuePair<string, string>("grant_type", "client_credentials")
        , new KeyValuePair<string, string>("client_id", "[service account app id e.g. 10d635e5-7615-472f-8200-a81d5c87c0ca")
        , new KeyValuePair<string, string>("client_secret", "[client secret defined in the service account e.g. 5L2ZJOBK8GI1wRSgGFooHcBkAOUOj65lQd9DgJxQOrw=]")
        , new KeyValuePair<string, string>("scope", "[App ID URI of the web api azure ad app]/.default e.g. https://my-b2c-tenant.onmicrosoft.com/my-azure-ad-ap/.default")
    });

    var requestResult = await httpClient.PostAsync("/[your b2c tenant].onmicrosoft.com/oauth2/v2.0/token", content);
    var contentResult = await requestResult.Content.ReadAsStringAsync();

    var json = JObject.Parse(contentResult);
    var accessToken = (string)json["access_token"];
}

App ID URI

应用 id uri 截图


您可能需要定义一些自定义声明来保护 Web API。请参阅此处的“应用程序权限”

  1. 在 Web API Azure AD App 上修改应用程序清单

    {
        "appRoles": [{
                "allowedMemberTypes": [
                    "Application"
                ],
                "displayName": "Some display nane",
                "id": "[create a new guid]",
                "isEnabled": true,
                "description": "Allow the application to _____ as itself.",
                "value": "the-blah-role"
            }
        ]
    }
    
  2. 将服务帐户 Azure AD 应用程序权限授予定义的自定义应用程序权限

授予服务帐户的权限将在roles声明中返回:

{
  "roles": [
    "the-blah-role"
  ]
}

对用户语音反馈项目进行投票以使其更容易

于 2018-02-28T19:11:49.807 回答
7

当前无法在没有交互式用户的情况下运行 Azure B2C。虽然我确信它会在某个时候到来,但目前,您无法创建基于 B2C 的后端应用程序。

根据Azure Active Directory B2C 预览:Limitations & Restrictions

守护进程/服务器端应用程序

包含长时间运行的进程或在没有用户在场的情况下运行的应用程序也需要一种访问安全资源的方法,例如 Web API。这些应用程序可以使用 OAuth 2.0 客户端凭据流使用应用程序的身份(而不是消费者的委托身份)进行身份验证和获取令牌。此流程在 Azure AD B2C 预览版中尚不可用 -也就是说,应用程序只能在发生交互式消费者登录流程后才能获得令牌。

于 2016-01-28T21:44:37.790 回答
0

仍处于预览阶段(截至 2018 年 1 月),但如果您使用的是 Azure Functions,则可能是您正在寻找的内容。查看Azure Functions 的 Microsoft Graph 绑定

于 2018-01-24T07:51:13.950 回答
0

如果您想要的是无头身份验证,为什么不单独使用 Azure AD?它有一个 API。如果您打算自己创建和管理所有 UI,为什么需要或需要 AD B2C?

于 2016-01-29T02:20:46.617 回答
0

Azure AD B2C 无法提供无头身份验证,但结合自定义旅程
虚荣域和自定义样式,用户可能永远不会离开您的站点

于 2017-07-25T13:00:51.217 回答
0

您正在寻找的是azure AD b2c 中OWIN 的资源所有者密码凭据。您可以参考 https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/13817784-add-support-for-resource-owner-password-credential支持此功能的实施

于 2017-07-27T04:43:45.067 回答