无头身份验证 Azure AD b2c

20

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

我已经研究了ADAL和Graph API,但还没有找到合适的内容。

Gina


请标记答案,如果它回答了你的问题。 - Karthikeyan VK
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"];
}

应用程序标识 URI

app id uri screenshot


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

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

    {
        "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"
  ]
}
请点赞用户反馈,以使其更容易实现。

[App ID URL] 是一个终端点 URI 还是一个范围 URI,例如 https://test.foo.dom 或 https://www.foo.com/some-scope? - Paul Hatcher
1
@spottenmahn - 谢谢,我的现在也正常工作了 - 只是尝试看看是否也能使用ADAL库完成这个。 - Paul Hatcher
@spottenmahn,您是如何在WebApi层验证令牌的 - 它是由不同的授权机构发行的,因此无法验证交互式登录? - Paul Hatcher
@PaulHatcher 不确定 spottedmahn 正在使用哪个 WebAPI 栈,但看起来 ASP.Net Core 并不支持多个身份验证提供程序 https://github.com/aspnet/Security/issues/1847#issuecomment-416644452 - GGirard
ASP.NET Core文档:使用多个身份验证方案 @PaulHatcher - spottedmahn

7

目前无法在没有交互式用户的情况下运行Azure B2C。虽然我相信它最终会到来,但目前,您不能基于B2C创建后端应用程序。

根据 Azure Active Directory B2C预览:限制和限制

守护程序/服务器端应用

包含长时间运行进程或在没有用户存在的情况下运行的应用程序还需要一种访问受保护资源(例如Web API)的方式。这些应用程序可以使用OAuth 2.0客户端凭据流通过应用程序标识进行身份验证并获取令牌(而不是使用消费者的委派标识)。在Azure AD B2C预览版中尚未提供此流 - 也就是说,应用程序只能在交互式消费者登录流之后获取令牌。


2
我一直希望这份文档已经过时了,他们会发布这个功能。 - Gina Marano
如果他们能加快速度完成它,那就太好了! - Michael B
1
@Mike 实际上,就我所知,ClientCredentials 用于后端授权。UserCredentials 则用于前端/移动设备授权。 - Konstantin
请查看Azure Functions的Microsoft Graph绑定 https://learn.microsoft.com/zh-cn/azure/azure-functions/functions-bindings-microsoft-graph - Tiago Andrade e Silva
1
通过AADB2C,是否可以以非交互方式进行用户注册? - Technoshaft
显示剩余2条评论

0
Azure AD B2C 无法提供无头身份验证,但结合自定义流程、虚拟域和自定义样式,用户可以在不离开您的网站的情况下完成身份验证。

你有关于虚荣域名的更多信息吗? - Chrift
我认为你需要直接联系Azure,因为在Azure将重定向到你的网站之前,需要进行DNS重定向和更改名称等操作。 - whatisthejava

0

1
阅读完这篇文章后:为什么资源所有者密码授权类型不是认证,也不适用于现代应用程序,似乎客户端凭据流是更合适的流程。 - spottedmahn
1
他们现在拥有这个。这里有说明 - spottedmahn

0
如果您需要无头身份验证,为什么不直接使用Azure AD呢?它有一个API。如果您打算自己创建和管理所有UI,那么为什么还需要AD B2C呢?

3
据我所知,Azure AD 仅支持特定于域名的电子邮件地址(johndoe@mydomaincom),不支持客户特定的电子邮件地址(janedoe@hotmail、janedoe@somedomain.net...)。我希望 Azure AD B2C 将很快允许真正的 API 身份验证/控制。其他 CIAM 服务,如 LoginRadius,已经允许此功能。 - Gina Marano

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接