使用Azure AD B2C进行身份验证

时间:2017-10-31 12:36:16

标签: azure oauth-2.0 azure-ad-b2c

我们已经使用Azure AD B2C和OAuth设置了我们的应用程序,这样可以正常工作,但我正在尝试作为服务进行身份验证,以便为服务调用提供服务。我对此稍微有些新意见,但我已经关注了Pluralsight上有关如何在“普通”Azure Active Directory上执行此操作的一些课程,我可以使其工作,但遵循B2C的相同原则不起作用。

我有这个快速的控制台应用程序:

SELECT * FROM member mem
INNER JOIN program pro om mem.id=pro.member_id
LEFT JOIN tmpTable tl ON t1.member_id=mem.member_id AND
CASE WHEN FIND_IN_SET(pro.`prog_name`, t1.prog_relate_task) THEN t1.program=pro.program AND t1.selectFlag='first'
ELSE t1.selectFlag='second' END 

服务的安全性如下:

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);
        }
    }
}

在我的B2C租户中,我有两个不同的应用程序,其设置如下:

Azure B2C app setup 两个应用程序都设置了来自“密钥”选项的秘密。生成的密钥与使用Azure Active Directory时的结构略有不同。

我可以成功获得令牌,但在尝试连接到其他服务时我得到401。与Azure Active Directory相比,使用B2C时,是否必须在授权方面做一些不同的事情?

2 个答案:

答案 0 :(得分:4)

Azure Active Directory B2C可以发出访问令牌,以便在以下情况下通过网络或本机应用访问API应用:

  1. 这两个应用都在B2C注册;和
  2. 访问令牌是交互式用户流(即授权代码或隐式流)的结果。
  3. 目前,您的特定方案 - 您需要发出访问令牌以供守护程序或服务器应用程序访问API应用程序(即客户端凭据流) - 不受支持,但您可以注册这两个应用程序都通过B2C租户的“App Registrations”刀片。

    您可以通过以下方式支持B2C对客户端凭据流的支持:

    https://feedback.azure.com/forums/169401-azure-active-directory/suggestions/18529918-aadb2c-support-oauth-2-0-client-credential-flow

    如果API应用程序要从Web /本机应用程序以及守护程序/服务器应用程序接收令牌,那么您将必须配置API应用程序以验证来自两个令牌发行者的令牌:一个是B2C而另一个是B2C租户中的Azure AD目录。

答案 1 :(得分:1)

我发现以下非常明确的微软文章解释了如何设置一个"服务帐户" / application ,具有对B2C租户的管理访问权限。对我来说,这就是我想要的用例"使用Azure AD B2C进行身份验证服务"。

对B2C租户具有管理访问权限的 可能不允许您访问您的B2C租户是授权服务器的受保护资源(I虽然没有尝试过,所以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。   在本文中,我们将讨论如何执行自动用例。为了演示,我们将构建一个.NET 4.5 B2CGraphClient,用于执行用户创建,读取,更新和删除(CRUD)操作。客户端将具有Windows命令行界面(CLI),允许您调用各种方法。但是,代码编写为以非交互式自动方式运行。