Понимание проблем с областями видимости с использованием 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, поэтому я планирую создавать записи пользователей в моей БД и сохранять связанные с ними роли для использования при авторизации в моем приложении. Следовательно, необходимо добавить новую заявку к принципалу после аутентификации пользователя и выполнить поиск в моей БД, чтобы увидеть, какие роли должен выполнять пользователь.

0 ответов

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