#asp.net-core #azure-active-directory #claims-based-identity #claims
#asp.net-core #azure-active-directory #идентификация на основе утверждений #заявки
Вопрос:
Я пытаюсь расширить утверждения, которые я получаю обратно от AzureAD. Я знаю, что доступно больше, но я понятия не имею, с чего начать. Документация находится повсюду.
В принципе, у меня есть ASP.Веб-приложение Net Core 2.2 настроено следующим образом:
services.Configure<CookiePolicyOptions>(options =>
{
// This lambda determines whether user consent for non-essential cookies is needed for a given request.
options.CheckConsentNeeded = context => true;
options.MinimumSameSitePolicy = SameSiteMode.None;
});
services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
.AddAzureAD(options => Configuration.Bind("AzureAd", options));
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder()
.RequireAuthenticatedUser()
.Build();
options.Filters.Add(new AuthorizeFilter(policy));
})
.SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
При попытке получить доступ к заявкам с помощью приведенного ниже кода я получаю только стандартные утверждения, в то время как в AzureAD и Graph загружено больше.
var claimsIdentity = User.Identity as ClaimsIdentity;
ClaimsDetected = claimsIdentity?.Claims.ToList();
Я уже адаптировал файл манифеста с различными параметрами, но, похоже, ничего не работает. Я погуглил свой * ss, но вся документация перегружена и не соответствует действительности или устарела.
У кого-нибудь есть рабочий пример или учебное пособие, или кто-нибудь может сказать мне, как я могу обогатить свой набор утверждений конкретными типами, которые я нашел на графике?
Спасибо
Ответ №1:
Для доступа jobTitle
из Azure AD к заявкам вам потребуется получить accesstoken для получения jobTitle
с помощью Graph API.
Подробные инструкции.
- Для получения accesstoken необходимо предоставить
ClientSecret
в AzureApp registrations
- Регистрация приложений-> Ваше приложение-> Настройки-> Ключи-> clientSecret или любая строка для описания ключа-> Истекает для вашего собственного сценария-> Скопируйте созданный clientSecret
-
Startup.cs
public void ConfigureServices(IServiceCollection services) { services.Configure<CookiePolicyOptions>(options => { // This lambda determines whether user consent for non-essential cookies is needed for a given request. options.CheckConsentNeeded = context => true; options.MinimumSameSitePolicy = SameSiteMode.None; }); services.AddAuthentication(AzureADDefaults.AuthenticationScheme) .AddAzureAD(options => Configuration.Bind("AzureAd", options)); services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options => { options.ResponseType = "id_token code"; options.ClientSecret = "ClientSecret in Azure"; options.Events = new OpenIdConnectEvents { OnAuthorizationCodeReceived = async context => { // Acquire a Token for the Graph API and cache it using ADAL. In the TodoListController, we'll use the cache to acquire a token for the Todo List API string userObjectId = (context.Principal.FindFirst("http://schemas.microsoft.com/identity/claims/objectidentifier"))?.Value; var authContext = new AuthenticationContext(context.Options.Authority); var credential = new ClientCredential(context.Options.ClientId, context.Options.ClientSecret); var authResult = await authContext.AcquireTokenByAuthorizationCodeAsync(context.TokenEndpointRequest.Code, new Uri(context.TokenEndpointRequest.RedirectUri, UriKind.RelativeOrAbsolute), credential, "https://graph.microsoft.com"); // Notify the OIDC middleware that we already took care of code redemption. context.HandleCodeRedemption(authResult.AccessToken, context.ProtocolMessage.IdToken); HttpClient client = new HttpClient(); HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "https://graph.microsoft.com/v1.0/me"); request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", authResult.AccessToken); HttpResponseMessage response = await client.SendAsync(request); var result = await response.Content.ReadAsStringAsync(); // Parse your Result to an Array var jArray = JObject.Parse(result); // Index the Array and select your jobTitle var obj = jArray["jobTitle"].Value<string>(); var identity = context.Principal.Identity as ClaimsIdentity; identity.AddClaim(new Claim("jobTitle", obj)); await Task.Yield(); }, }; }); services.AddMvc(options => { var policy = new AuthorizationPolicyBuilder() .RequireAuthenticatedUser() .Build(); options.Filters.Add(new AuthorizeFilter(policy)); }) .SetCompatibilityVersion(CompatibilityVersion.Version_2_2); }
Комментарии:
1. Спасибо, пришлось импортировать
Microsoft.IdentityModel.Clients.ActiveDirectory
пакет, чтобы все заработало, но теперь это работает, и я наконец понимаю, почему. Спасибо, что нашли время.