как использовать IClaimsTransformation в проекте core2.2 MVC - PullRequest
0 голосов
/ 14 октября 2019

Я пытаюсь узнать, как использовать IClaimsTransformation для изменения утверждений пользователей в Windows-аутентификации. Но когда я пытаюсь использовать его, я получаю сообщение об ошибке:

«InvalidOperationException: не указана схема authenticationScheme, и не найден DefaultChallengeScheme».

Я в основном пробовал это на Mac, но я также пробовал на моем ПК компании в домене компании. Оба они дают мне ту же ошибку. Также я IIS Express (режим отладки от VS и Rider).

в моем файле запуска

public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddAuthentication(IISDefaults.AuthenticationScheme);
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);

        services.AddSingleton<IClaimsTransformation, UserClaims>();

    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
        else
        {
            app.UseExceptionHandler("/Home/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.UseHttpsRedirection();
        app.UseStaticFiles();
        app.UseCookiePolicy();
        app.UseAuthentication();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}/{id?}");
        });



    }

, и у меня есть этот класс для преобразования утверждений

public class UserClaims: IClaimsTransformation
{
    public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
    {
        var ci = (ClaimsIdentity) principal.Identity;
        var c = new Claim(ci.RoleClaimType, "Admin");
        ci.AddClaim(c);
        return Task.FromResult(principal);
    }
}

также использующий этот декоратор для моего контроллера

[Authorize(Roles = "Admin")]

Ответы [ 2 ]

0 голосов
/ 16 октября 2019

Прежде всего, используя Rider в качестве IDE, испортили мои настройки отладки, и после удаления демонстрационного приложения и восстановления настроек отладки до настроек IIS Express по умолчанию мне удалось заставить мой код работать.

После этого у меня былоошибка 403 каждый раз, когда я пытался отладить свое приложение, и с помощью @itminus мы нашли проблему в моем порядке промежуточного программного обеспечения. Я использовал UseAuthorization () поверх UseAuthentication (), и это была моя ошибка. Поэтому использование UseAuthentication () поверх UseAuthorization () решило мою вторую проблему.

0 голосов
/ 15 октября 2019

"InvalidOperationException: не указана схема аутентификации, и не найден DefaultChallengeScheme."

У меня возникла такая же проблема, когда я использовал аутентификацию Windows несколько месяцев назад. Оказывается, я не включил Windows Authentication.

Пожалуйста, проверьте вкладку Свойства / Отладка и убедитесь, что Enable Windows Authentication отмечен:

enter image description here


КакПримечание: вы модифицируете оригинал principal. ИМО, возвращение принципиально нового принципала является предпочтительным:

public Task<ClaimsPrincipal> TransformAsync(ClaimsPrincipal principal)
{
    <b>var cp = principal.Clone();</b>                   // create a copy
    var ci = (ClaimsIdentity)cp.Identity;
    var c = new Claim(ci.RoleClaimType, "Admin");
    ci.AddClaim(c);                               // modify the copy
    return Task.FromResult(cp);                          
}
...