Понимание проблем с областями видимости с использованием ClaimsTransformation и DI для доступа к dbContext
В настоящее время я пытаюсь реализовать ClaimsTransformation в моем событии OnTokenValidated, и у меня возникают проблемы с областями видимости. Я получаю ошибку:
System.InvalidOperationException: Невозможно использовать выделенную службу "Microsoft.AspNetCore.Authentication.IClaimsTransformation" из синглтона "Microsoft.Extensions.Options.IConfigureOptions`1[Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectOptions]".
Во-первых, вот регистрация моих услуг.
services.AddAuthentication(sharedOptions =>
{
sharedOptions.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddAzureAd(options => Configuration.Bind("AzureAd", options))
.AddCookie
(cookie =>
{
cookie.AccessDeniedPath = "/Error";
});
// This sample uses an in-memory cache for tokens and subscriptions.
services.AddMemoryCache();
services.AddSession();
// Add application services.
//services.AddSingleton<IConfiguration>(Configuration);
services.AddSingleton<IGraphAuthProvider, GraphAuthProvider>();
services.AddTransient<IGraphSdkHelper, GraphSdkHelper>();
// DI for claims transformation
services.AddTransient<IClaimsTransformation, ClaimsTransformer>();
// DEBUG DB (local)
services.AddDbContext<TestContext>(options =>
options.UseSqlServer("Server=(localdb)\\mssqllocaldb;Database=TestContext;Trusted_Connection=True;MultipleActiveResultSets=true"));
Затем я регистрирую дополнительные сервисы внутри моего AuthenticationBuilder.
public static AuthenticationBuilder AddAzureAd(this AuthenticationBuilder builder, Action<AzureAdOptions> configureOptions)
{
builder.Services.Configure(configureOptions);
builder.Services.AddSingleton<IConfigureOptions<OpenIdConnectOptions>, ConfigureAzureOptions>();
builder.AddOpenIdConnect();
return builder;
}
В моем AzureAdAuthenticationBuilderExtensions
файл, в котором я размещаю события OpenIdConnectResponseType, я передаю в субъект утверждений.
},OnTokenValidated = async (context) =>
{
// Pass in the claims principal to append ACLs
await _claimsTransformer.TransformAsync(context.Principal);
}
А вот фрагмент, где я пытаюсь получить доступ к своему dbContext через DI, что вызывает проблемы с областями видимости.
private readonly Test.Models.TestContext _dbContext;
public ClaimsTransformer(TestContext dbContext)
{
_dbContext = dbContext;
}
Я понимаю общую проблему службы, зависящей от другой службы с более коротким сроком службы, однако я следил за несколькими различными ресурсами в Интернете, чтобы объединить эту реализацию, и я не совсем уверен, как решить проблему и разрешить доступ к моей службе dbContext. в моем ClaimsTransformation
реализация. Я видел совершенно разные решения, которые вообще не использовали преобразование претензий и вместо этого решили использовать UserClaimsPrincipalFactory
хотя я не знаю, является ли это просто альтернативой или, на самом деле, это актуальный способ реализации этой функциональности.
https://kevin-junghans.blogspot.com/2017/08/customizing-claims-for-authorization-in.html
Кроме того, любая критика кода и / или проблемы всегда приветствуются, я всегда ценю возможность учиться! В качестве дополнения я работаю с AzureAD, но у меня нет возможности создавать группы в этом экземпляре Azure, поэтому я планирую создавать записи пользователей в моей БД и сохранять связанные с ними роли для использования при авторизации в моем приложении. Следовательно, необходимо добавить новую заявку к принципалу после аутентификации пользователя и выполнить поиск в моей БД, чтобы увидеть, какие роли должен выполнять пользователь.