Назначить роли для идентификации из базы данных - PullRequest
0 голосов
/ 01 мая 2020

Я пишу блаженный сайт, который должен разрешать доступ к определенным страницам на основе записей в уже существующей базе данных SQL. Я изучал то, что требуется, но в основном нашел инструкции для этого. Net Core 1.0, но процесс изменился для 2.0 и выше, и я не могу найти полную картину того, что мне нужно сделать .

Мой сайт использует windows аутентификацию. Я изменил страницу следующим образом: @attribute [Authorize (Roles = "Editor")]. Я добавил реализацию IClaimsTransformation следующим образом:

public class ClaimsTransformer : IClaimsTransformation {

    private readonly Model model;

    public ClaimsTransformer(Model model) {
        this.model = model;
    }

    public async Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal) {
        var cp = principal.Clone();
        var identity = (ClaimsIdentity)cp.Identity;
        var userName = identity.Name;
        var usec = await model.ApprovalUsers.SingleOrDefaultAsync(r => EF.Functions.Like(r.Login, userName));
        if (usec != null) {
            if (usec.IsEditor) identity.AddClaim(new Claim(ClaimTypes.Role, "Editor"));
        }
        return cp;
    }
}

Модель - это модель EF Core. На данный момент я удалил все, кроме заявления редактора, чтобы упростить задачу.

Ниже приведены мои ConfigureServices:

    public void ConfigureServices(IServiceCollection services) {
        services.AddRazorPages();
        services.AddScoped<IClaimsTransformation, ClaimsTransformer>();
        services.AddDbContext<Model>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")), ServiceLifetime.Transient);
        services.AddBlazoredToast();
        services.AddServerSideBlazor();
        services.AddAuthorization(opt => {
            opt.AddPolicy("Admin", policy => policy.RequireClaim("Admin"));
            opt.AddPolicy("Editor", policy => policy.RequireClaim("Editor"));
        });
    }

И это моя конфигурация:

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env) {

        if (env.IsDevelopment()) {
            app.UseDeveloperExceptionPage();
        } else {
            app.UseExceptionHandler("/Error");
            // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts.
            app.UseHsts();
        }

        app.UseAuthentication();

        app.UseHttpsRedirection();
        app.UseStaticFiles();

        app.UseRouting();

        app.UseAuthorization();

        app.UseEndpoints(endpoints => {
            endpoints.MapBlazorHub();
            endpoints.MapFallbackToPage("/_Host");
        });
    }

Когда я перехожу на страницу с атрибутом авторизации, я получаю сообщение «Не авторизовано», но моя реализация IClaimsTransformation никогда не вызывается. Я не уверен, нужно ли мне что-то добавлять в ConfigureServices, чтобы зарегистрировать это в системе авторизации (а также зарегистрировать как службу с ограниченным доступом). Я также не уверен, что это правильный способ достичь того, что я пытаюсь сделать:

        services.AddAuthorization(opt => {
            opt.AddPolicy("Admin", policy => policy.RequireClaim("Admin"));
            opt.AddPolicy("Editor", policy => policy.RequireClaim("Editor"));
        });

Может ли кто-нибудь указать мне правильное направление?

1 Ответ

0 голосов
/ 01 мая 2020

Хорошо, похоже, ответ должен был иметь следующую строку в ConfigureServices:

            services.AddAuthentication(Microsoft.AspNetCore.Server.IISIntegration.IISDefaults.AuthenticationScheme);

Вместо простого

services.AddAuthentication();

Я предположил бы это, так как приложение знало из моих windows учетных данных, аутентификация прошла успешно, но я думаю, что нет.

Кроме того, в политике не было необходимости - очевидно, задним числом, поскольку я использую роли, а не политики. Я думаю, я пытался столько перестановок в тот момент, что я потерял из виду то, что я пытался достичь

...