使用 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

为 Azure AD B2C 自定义策略调用 New-CpimCertificate 时出现问题

如何通过 Azure AD B2C 使用身份验证功能在 Azure Web App 上添加身份验证?

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