Получите список каталогов пользователей Azure B2C в функции Azure с помощью MSAL.NET

В настоящее время мы получаем список наших пользователей, используя MS Graph и конечную точку directoryObjects/getByIds.

При запуске ASP NET Core API мы используем Microsoft.IdentityModel.Clients.ActiveDirectory и этот код

      services.AddHttpClient("GraphApi", async hc =>
{
    AuthenticationContext authContext = new AuthenticationContext("https://login.microsoftonline.com/" + this.configuration["GraphApi:Tenant"]);
    ClientCredential credential = new ClientCredential(this.configuration["GraphApi:ClientId"], this.configuration["GraphApi:ClientSecret"]);
    hc.BaseAddress = new Uri($"https://graph.microsoft.com/v1.0/");
    hc.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
    AuthenticationResult result = await authContext.AcquireTokenAsync("https://graph.microsoft.com/", credential);
    hc.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", result.AccessToken);
});

Я создаю новую функцию Azure, и мне нужно сделать то же самое снова. Я собирался использовать тот же код и Microsoft.IdentityModel.Clients.ActiveDirectory, но этот пакет устарел, и мы должны использовать Microsoft.Identity.Client.

Я вижу множество примеров для различных сценариев, но, похоже, все они вызывают общедоступный MS Graph, тогда как я хочу получить пользователей из нашего собственного Azure B2C. Может ли кто-нибудь указать мне на правильные ресурсы \ demo.

Функция Azure не будет работать в контексте пользователя, поэтому подход с управляемым удостоверением или секретом клиента будет полезен.

1 ответ

Я реализовал аналогичный сценарий для получения пользователя Azure AD, но по-другому в MVC.

КОД

Я использовал эти пакеты NuGet

      using Microsoft.Owin.Security;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.OpenIdConnect;

Стартовый класс

      public class Startup
    {
        string clientId = System.Configuration.ConfigurationManager.AppSettings["ClientId"];

        string redirectUri = System.Configuration.ConfigurationManager.AppSettings["RedirectUri"];

        static string tenant = System.Configuration.ConfigurationManager.AppSettings["Tenant"];

        string authority = String.Format(System.Globalization.CultureInfo.InvariantCulture, System.Configuration.ConfigurationManager.AppSettings["Authority"], tenant);

        public void Configuration(IAppBuilder app)
        {
            app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
            Microsoft.IdentityModel.Logging.IdentityModelEventSource.ShowPII = true;
            app.UseCookieAuthentication(new CookieAuthenticationOptions());
            app.UseOpenIdConnectAuthentication(
                new OpenIdConnectAuthenticationOptions
                {
                    ClientId = clientId,
                    Authority = authority,
                    RedirectUri = redirectUri,
                    PostLogoutRedirectUri = redirectUri,
                    Scope = OpenIdConnectScope.OpenIdProfile,
                    ResponseType = OpenIdConnectResponseType.CodeIdToken,
                    TokenValidationParameters = new TokenValidationParameters()
                    {
                        ValidateIssuer = false // This is a simplification
                    },
                    Notifications = new OpenIdConnectAuthenticationNotifications
                    {
                        AuthenticationFailed = OnAuthenticationFailed
                    },
                }
            );
        }

        private Task OnAuthenticationFailed(AuthenticationFailedNotification<OpenIdConnectMessage, OpenIdConnectAuthenticationOptions> context)
        {
            context.HandleResponse();
            context.Response.Redirect("/?errormessage=" + context.Exception.Message);
            return Task.FromResult(0);
        }

HomeКонтроллер

      public void SignIn()
        {
            if (!Request.IsAuthenticated)
            {

                HttpContext.GetOwinContext().Authentication.Challenge( new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectAuthenticationDefaults.AuthenticationType);
            }
        }

        public void SignOut()
        {
            HttpContext.GetOwinContext().Authentication.SignOut( OpenIdConnectAuthenticationDefaults.AuthenticationType, CookieAuthenticationDefaults.AuthenticationType);
        }

ПретензииКонтроллер

      public ActionResult Index()
        {
            var userClaims = User.Identity as System.Security.Claims.ClaimsIdentity;

            ViewBag.Name = userClaims?.FindFirst("name")?.Value;
            ViewBag.Username = userClaims?.FindFirst("preferred_username")?.Value;
            ViewBag.Subject = userClaims?.FindFirst(System.Security.Claims.ClaimTypes.NameIdentifier)?.Value;
            ViewBag.TenantId = userClaims?.FindFirst("http://schemas.microsoft.com/identity/claims/tenantid")?.Value;
            return View();
        }

Я попытался охватить все возможные реализации. Надеюсь, что это сработает в вашем случае

Спасибо

Другие вопросы по тегам