Проверка подлинности 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

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