使用 Azure AD B2C 作为服务进行身份验证
Posted
技术标签:
【中文标题】使用 Azure AD B2C 作为服务进行身份验证【英文标题】:Authenticating as a Service with Azure AD B2C 【发布时间】:2018-04-12 15:13:13 【问题描述】:我们已经使用 Azure AD B2C 和 OAuth 设置了我们的应用程序,这工作正常,但是我正在尝试作为服务进行身份验证,以便进行服务到服务调用。我对此有点陌生,但我在 Pluralsight 上学习了一些关于如何在“正常”Azure Active Directory 上执行此操作的课程,我可以让它工作,但遵循与 B2C 相同的原则是行不通的。
我有这个快速控制台应用程序:
class Program
private static string clientId = ConfigurationManager.AppSettings["ida:ClientId"]; //APIClient ApplicationId
private static string appKey = ConfigurationManager.AppSettings["ida:appKey"]; //APIClient Secret
private static string aadInstance = ConfigurationManager.AppSettings["ida:aadInstance"]; //https://login.microsoftonline.com/0
private static string tenant = ConfigurationManager.AppSettings["ida:tenant"]; //B2C Tenant
private static string serviceResourceId = ConfigurationManager.AppSettings["ida:serviceResourceID"]; //APP Id URI For API
private static string authority = String.Format(CultureInfo.InvariantCulture, aadInstance, tenant);
private static AuthenticationContext authContext = new AuthenticationContext(authority);
private static ClientCredential clientCredential = new ClientCredential(clientId, appKey);
static void Main(string[] args)
AuthenticationResult result = authContext.AcquireToken(serviceResourceId, clientCredential);
Console.WriteLine("Authenticated succesfully.. making HTTPS call..");
string serviceBaseAddress = "https://localhost:44300/";
HttpClient httpClient = new HttpClient();
httpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
HttpResponseMessage response = httpClient.GetAsync(serviceBaseAddress + "api/location?cityName=dc").Result;
if (response.IsSuccessStatusCode)
string r = response.Content.ReadAsStringAsync().Result;
Console.WriteLine(r);
服务的安全性如下:
private void ConfigureAuth(IAppBuilder app)
var azureADBearerAuthOptions = new WindowsAzureActiveDirectoryBearerAuthenticationOptions
Tenant = ConfigurationManager.AppSettings["ida:Tenant"],
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters()
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"]
;
app.UseWindowsAzureActiveDirectoryBearerAuthentication(azureADBearerAuthOptions);
在我的 B2C 租户中,我有两个不同的应用程序,它们的设置大致如下:
两个应用程序都设置了来自“密钥”选项的秘密。生成的密钥与使用 Azure Active Directory 时的结构略有不同。
我可以成功获取令牌,但在尝试连接到其他服务时得到 401。与 Azure Active Directory 相比,使用 B2C 时,我是否必须在授权方面做一些不同的事情?
【问题讨论】:
headless authentication Azure AD b2c的可能重复 【参考方案1】:如果满足以下条件,Azure Active Directory B2C 可以颁发访问令牌以供 Web 或本机应用访问 API 应用:
-
这两个应用程序都在 B2C 注册;和
访问令牌是作为交互式用户流(即授权代码或隐式流)的结果颁发的。
目前,不支持您的特定场景 - 您需要颁发访问令牌以供守护程序或服务器应用程序访问 API 应用程序(即客户端凭据流) - 不受支持,但您可以注册这两个应用程序都通过 B2C 租户的“应用程序注册”刀片。
您可以投票支持 B2C 的客户端凭据流:
https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/18529918-aadb2c-support-oauth-2-0-client-credential-flow
如果 API 应用程序要从 web/native 应用程序以及守护程序/服务器应用程序接收令牌,那么您将必须配置 API 应用程序以验证来自两个令牌颁发者的令牌:一个是 B2C,另一个是B2C 租户中的 Azure AD 目录。
【讨论】:
感谢您确认。我昨晚发现了相同的信息,并通过 B2C 租户的应用程序注册刀片使其工作,但直接在 B2C 应用程序中更容易。 @ruffen - 关于你如何做到这一点的更多线索? @ubienewbie 见this SO post【参考方案2】:我发现以下来自 Microsoft 的非常清晰的文章解释了如何设置“服务帐户”/应用程序对 B2C 租户具有管理访问权限。对我来说,这就是我想要“使用 Azure AD B2C 将身份验证为服务”的用例。
对 B2C 租户拥有管理访问权限可能不允许您访问您的 B2C 租户作为授权服务器的受保护资源(我没有t 尝试过),所以 OP 的用例可能略有不同,但感觉非常接近。
https://docs.microsoft.com/en-us/azure/active-directory-b2c/active-directory-b2c-devquickstarts-graph-dotnet
对于自动化、连续的任务,您应该使用某种类型的服务帐户,这些服务帐户您提供了执行管理任务所需的权限。在 Azure AD 中,您可以通过注册应用程序并向 Azure AD 进行身份验证来执行此操作。这是通过使用使用 OAuth 2.0 客户端凭据授权的应用程序 ID 来完成的。在这种情况下,应用程序作为自己而不是用户来调用 Graph API。 在本文中,我们将讨论如何执行自动化用例。 为了演示,我们将构建一个执行用户创建、读取、更新和删除 (CRUD) 的 .NET 4.5 B2CGraphClient操作。客户端将具有允许您调用各种方法的 Windows 命令行界面 (CLI)。但是,代码被编写为以非交互式、自动化的方式运行。
【讨论】:
B2C 租户也有一个普通的 Active Directory 实例。在我的应用程序中,我接受两种不同的身份验证方式,普通用户的 B2C JWT 令牌和标准 AD 的 JWT 令牌。服务通过标准 AD 进行身份验证,因为 B2C 不支持此功能。这可能现在已经改变了,因为我相信 MS 正在通过 B2C 提供支持服务。以上是关于使用 Azure AD B2C 作为服务进行身份验证的主要内容,如果未能解决你的问题,请参考以下文章
azure 应用服务身份验证模块是不是支持 azure ad b2c?
使用 azure AD B2C 进行 blazor web api 身份验证
为 Azure AD B2C 自定义策略调用 New-CpimCertificate 时出现问题