В ASP.NET Core 2 войти в Azure AD довольно просто, в ConfigureServices (службы IServiceCollection) просто добавьте следующее
// Azure AD login
services.AddAuthentication(a =>
{
a.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
a.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
a.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(o => o.LoginPath = new PathString("/Account/SignIn"))
.AddOpenIdConnect(o =>
{
o.ClientId = Configuration["Authentication:AzureAd:ClientId"];
o.ClientSecret = Configuration["Authentication:AzureAd:ClientSecret"];
o.Authority = Configuration["Authentication:AzureAd:AADInstance"] +
Configuration["Authentication:AzureAd:TenantId"];
o.CallbackPath = Configuration["Authentication:AzureAd:CallbackPath"];
o.ResponseType = OpenIdConnectResponseType.CodeIdToken;
o.Events = new OpenIdConnectEvents
{
OnRemoteFailure = RemoteFailure,
OnTokenValidated = TokenValidated
};
});
и все работает нормально. Затем я могу добавить утверждения в TokenValidated, и это тоже отлично работает:
private Task TokenValidated(TokenValidatedContext context)
{
var claims = new List<Claim>();
var claim = new Claim(ClaimTypes.Role, "Test", ClaimValueTypes.String, "Issuername")
context.Principal.AddIdentity(new ClaimsIdentity(claims));
return Task.FromResult(0);
}
Однако это никогда не бывает так просто. Требуемые утверждения зависят от внешних вызовов службы, а адрес сохраняется в конфигурации.
В ConfigureServices у меня также есть различные классы, добавленные для внедрения зависимостей, которые отлично работают для контроллеров.
services.AddTransient<IRoleClaims, RoleClaims>();
Этот RoleClaims - это класс, который я хочу вызвать из метода TokenValidated, но, насколько я понимаю, я не могу использовать здесь DI. Я также не могу получить доступ к ServiceCollection, чтобы получить его через ActivatorUtilities.CreateInstance.
Конструктор RoleClaims выглядит так:
public RoleClaims(IOptions<EmployeeConfiguration> configuration)
Итак, большой вопрос: как это должно работать? Могу ли я как-то использовать внедрение зависимостей в методе TokenValidated? Я пытаюсь добавить свои претензии не в то место?