无头身份验证 Azure AD b2c

Posted

技术标签:

【中文标题】无头身份验证 Azure AD b2c【英文标题】:headless authentication Azure AD b2c 【发布时间】:2016-05-06 11:18:20 【问题描述】:

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

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

吉娜

【问题讨论】:

如果回答了您的问题,请标记答案 【参考方案1】:

如 here 所述,您可以将 Azure AD 应用程序用于服务帐户的 Client Credential Flow。它不是最佳的,但它有效。

    Define an Azure AD App 用于 Web API Define an Azure AD App 每个服务帐户 配置 Web API 以接受来自 B2C 租户和 Azure AD 的令牌 假设您已经为 B2C 配置了 Web API... Azure AD 应用程序的众所周知的配置 URL 是 https://login.microsoftonline.com/[your-b2c-tenant].onmicrosoft.com/.well-known/openid-configuration 延伸阅读:ASP.NET Core 文档:Use multiple authentication schemes 针对 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


您可能希望定义一些自定义声明来保护 Web API。见'Application Permissions' here。

    在 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"
            
        ]
    
    

    将服务帐户 Azure AD 应用权限授予定义的自定义应用程序权限

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


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


请投票the user voice feedback item 让这更容易?

【讨论】:

[App ID URL] 是端点 uri 还是范围 uri,例如test.foo.dom 或 foo.com/some-scope? @spottenmahn - 谢谢,我的现在正在工作 - 只是想看看我是否也可以使用 ADAL 库来做到这一点 @spottenmahn 您是如何在 WebApi 层验证令牌的 - 它的颁发机构与交互式登录不同,因此无法验证? @PaulHatcher 不确定 spotmahn 正在使用哪个 WebAPI 堆栈,但看起来 ASP.Net Core 不支持开箱即用的多个身份验证提供程序github.com/aspnet/Security/issues/1847#issuecomment-416644452 ASP.NET Core 文档:Use multiple authentication schemes@PaulHatcher【参考方案2】:

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

根据Azure Active Directory B2C preview: Limitations & Restrictions

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

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

【讨论】:

我一直希望文档已经过时,他们会发布此功能。 如果他们能继续前进并完成它,那就太好了! 我假设@ginalster 用例略有不同(就像我的一样)。在那里,他让用户可以进行身份​​验证(提供用户名和密码),但他不想通过重定向 url 执行此操作。即他想在他的应用程序上构建整个用户体验 @Mike 实际上,ClientCredentials 用于后端授权 AFAIK。 UserCredentials 用于前端/移动授权。 用户是否可以通过 AADB2C 以非交互方式注册?【参考方案3】:

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

【讨论】:

据我所知,Azure AD 仅支持特定于域的电子邮件地址 (johndoe@mydomaincom) 而不是客户的特定电子邮件地址 (janedoe@hotmail, janedoe@somedomain.net...)。我希望 Azure AD B2C 能够很快实现真正的 API 身份验证/控制。其他 CIAM 服务,如 LoginRadius,已经允许这样做。【参考方案4】:

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

【讨论】:

您有更多关于虚域的信息吗? 我认为您需要直接联系 Azure,因为在 Azure 重定向到您的网站之前需要通过 DNS 重定向名称更改内容【参考方案5】:

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

【讨论】:

阅读此内容后:Why the Resource Owner Password Credentials Grant Type is not Authentication nor Suitable for Modern Applications 似乎,客户端凭据流是更合适的流。 他们现在有了这个。 Instructions are here【参考方案6】:

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

【讨论】:

以上是关于无头身份验证 Azure AD b2c的主要内容,如果未能解决你的问题,请参考以下文章

azure 应用服务身份验证模块是不是支持 azure ad b2c?

使用 Azure AD B2C 作为服务进行身份验证

使用 azure AD B2C 进行 blazor web api 身份验证

我们如何在 Xamarin 表单中删除/自定义 Azure AD B2C 身份验证 webview 页面标题栏?

在 Azure AD 中创建用户之前,是不是可以使用 Azure B2C 自定义策略验证来自社交身份提供商 (iDP) 的电子邮件声明?

Azure AD B2C 与 ASP.NET Web API 发出令牌,用于 Web API 中的身份验证和访问 MS Graph API