Проверка подлинности ASP.NET Core в Azure Active Directory и сохранение пользовательских утверждений в запросах
У меня есть веб-сайт ASP.NET Core по умолчанию, созданный в Visual Studio 2017. Я решил пройти проверку подлинности с помощью Azure Active Directory. Я запускаю сайт и могу успешно войти, используя учетную запись в Active Directory.
Я могу получить информацию о претензиях, предоставленную Active Directory, например, позвонив по следующей строке и получу "имя".
User.Claims.FirstOrDefault(c => c.Type == "name")?.Value;
Я хочу добавить пользовательскую заявку - CompanyId = 123456 для вошедшего в систему пользователя. Я могу добавить пользовательскую претензию, однако она доступна только на странице, где установлена претензия.
Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
((ClaimsIdentity)User.Identity).AddClaim(claim);
Насколько я понимаю, мне нужно каким-то образом обновить токен, выданный Active Directory, или установить требование до того, как токен будет выпущен. Я не уверен, как это сделать.
Я подозреваю, что это должно быть сделано в AccountController в SignIn()
// GET: /Account/SignIn
[HttpGet]
public IActionResult SignIn()
{
return Challenge(
new AuthenticationProperties { RedirectUri = "/" }, OpenIdConnectDefaults.AuthenticationScheme);
}
Я прочитал множество статей и примеров об этом сценарии (включая https://github.com/ahelland/AADGuide-CodeSamples/tree/master/ClaimsWebApp), однако не смог решить, как сохранить претензию в запросах.
Мне удалось сохранить пользовательские утверждения, используя ASP.NET Identity в качестве поставщика проверки подлинности, но это происходит потому, что пользовательское требование сохраняется в базе данных.
2 ответа
OnTokenValidated
предлагает вам возможность изменить ClaimsIdentity
полученный из входящего токена, код ниже для вашей справки:
private Task TokenValidated(TokenValidatedContext context)
{
Claim claim = new Claim("CompanyId", "123456", ClaimValueTypes.String);
(context.Ticket.Principal.Identity as ClaimsIdentity).AddClaim(claim);
return Task.FromResult(0);
}
Настройка OpenIdConnectEvents
:
Events = new OpenIdConnectEvents
{
OnRemoteFailure = OnAuthenticationFailed,
OnAuthorizationCodeReceived = OnAuthorizationCodeReceived,
OnTokenValidated = TokenValidated
}
Затем в контроллере с помощью:
var companyId= User.Claims.FirstOrDefault(c => c.Type == "CompanyId")?.Value;
Для тех, кто хотел бы получить более подробную информацию, предоставленный код находится в Startup.cs
В метод Configure добавьте / отредактируйте:
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
ClientId = Configuration["Authentication:AzureAd:ClientId"],
Authority = Configuration["Authentication:AzureAd:AADInstance"] + Configuration["Authentication:AzureAd:TenantId"],
CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"],
Events = new OpenIdConnectEvents
{
OnTokenValidated = TokenValidated
}
});
Закрытый метод Task TokenValidated находится в теле файла Startup.cs.
Следующий пример является хорошим справочным материалом. https://github.com/Azure-Samples/active-directory-dotnet-webapp-openidconnect-aspnetcore-v2/blob/master/WebApp-OpenIDConnect-DotNet/Startup.cs