Blazor AD аутентификация Безопасная ручка закрыта - PullRequest
1 голос
/ 18 июня 2019

Я пытаюсь выполнить аутентификацию AD с помощью Blazor (Server-side и .net core 3.0 preview-6).

Когда я добавляю @attribute [Authorize(Roles = "DomainUsers")], я получаю ошибку ниже.

Я получаю ту же ошибку, если перехожу на Политику. Однако, если я использую только [Authorize], я не получаю сообщение об ошибке.

Это происходит, когда я нажимаю на ссылку в меню. Если я напишу прямой путь в браузере, я буду работать как положено.

public Startup(IConfiguration config)
    {
        Configuration = config;
    }

    public IConfiguration Configuration { get; }

    // This method gets called by the runtime. Use this method to add services to the container.
    // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddMvc().AddNewtonsoftJson();
        services.AddRazorPages();
        services.AddServerSideBlazor();
        services.AddHttpContextAccessor();
        services.AddAuthentication();
        services.AddAuthorization();

        services.AddHttpClient();

        var appDB = Configuration.GetConnectionString("AppDB");
        services.Configure<CtApiSettings>(Configuration.GetSection("CtApiSettings"));

        services.AddDbContext<ApplicationContext>(o => o.UseSqlServer(appDB, builder =>
        {
            builder.EnableRetryOnFailure(5, TimeSpan.FromSeconds(10), null);
        }));


        services.AddToaster(config =>
        {
            config.PositionClass = Defaults.Classes.Position.TopFullWidth;
            config.PreventDuplicates = false;
            config.NewestOnTop = false;
            config.ShowTransitionDuration = 500;
            config.VisibleStateDuration = 5000;
            config.HideTransitionDuration = 500;
        });

        // Setup HttpClient for server side in a client side compatible fashion
        services.AddScoped<HttpClient>(s =>
        {
            // Creating the URI helper needs to wait until the JS Runtime is initialized, so defer it.
            var uriHelper = s.GetRequiredService<IUriHelper>();
            return new HttpClient
            {
                BaseAddress = new Uri(uriHelper.GetBaseUri())
            };
        });

        ActiveDirectoryModel adm = new ActiveDirectoryModel();
        Configuration.GetSection("AD").Bind(adm);
        services.Configure<ActiveDirectoryModel>(Configuration.GetSection("AD"));

        services.AddScoped<ExcelExportService>();
        services.AddScoped<IAreaService, AreaService>();
        services.AddScoped<IUserProvider>(x => new UserProvider(adm));
        services.AddScoped<IAdminService, AdminService>();
    }

    // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
    public void Configure(IApplicationBuilder app, IWebHostEnvironment 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.UseRouting();

        app.UseAuthentication();
        app.UseAuthorization();

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

Ошибка: System.ObjectDisposedException: безопасный дескриптор закрыт. Название объекта: «SafeHandle». в System.Runtime.InteropServices.SafeHandle.DangerousAddRef (Boolean & успех) в System.StubHelpers.StubHelpers.SafeHandleAddRef (SafeHandle pHandle, Логическое и успех) в Interop.Advapi32.GetTokenInformation (SafeAccessTokenHandle TokenHandle, UInt32 TokenInformationClass, SafeLocalAllocHandle TokenInformation, UInt32 TokenInformationLength, UInt32 & ReturnLength) в System.Security.Principal.WindowsIdentity.GetTokenInformation (SafeAccessTokenHandle tokenHandle, TokenInformationClass tokenInformationClass, Boolean nullOnInvalidParam) в System.Security.Principal.WindowsIdentity.get_User () в System.Security.Principal.WindowsIdentity.b__51_0 () в System.Security.Principal.WindowsIdentity. <> C__DisplayClass67_0.b__0 (Объект ) в System.Threading.ExecutionContext.RunInternal (ExecutionContext выполнениеContext, обратный вызов ContextCallback, состояние объекта) --- Конец стека трассировки из предыдущего места, где было сгенерировано исключение --- в System.Threading.ExecutionContext.RunInternal (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Threading.ExecutionContext.Run (ExecutionContext executeContext, обратный вызов ContextCallback, состояние объекта) в System.Security.Principal.WindowsIdentity.RunImpersonatedInternal (SafeAccessTokenHandle токен, действие действие) в System.Security.Principal.WindowsIdentity.RunImpersonated (SafeAccessTokenHandle safeAccessTokenHandle, действие Action) в System.Security.Principal.WindowsIdentity.GetName () в System.Security.Principal.WindowsIdentity.get_Name () в System.Security.Principal.WindowsIdentity.InitializeClaims () в System.Security.Principal.WindowsIdentity.get_Claims () + MoveNext ()
в System.Security.Claims.ClaimsIdentity.HasClaim (тип String, строка значение) в System.Security.Claims.ClaimsPrincipal.IsInRole (String роль) в System.Security.Principal.WindowsPrincipal.IsInRole (String роль) в Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement. <> C__DisplayClass4_0.b__0 (String r) в System.Linq.Enumerable.Any [TSource] (предикат IEnumerable 1 source, Func 2) в Microsoft.AspNetCore.Authorization.Infrastructure.RolesAuthorizationRequirement.HandleRequirementAsync (AuthorizationHandlerContext контекст, требование RolesAuthorizationRequirement) в Microsoft.AspNetCore.Authorization.AuthorizationHandler 1.HandleAsync(AuthorizationHandlerContext context) at Microsoft.AspNetCore.Authorization.Infrastructure.PassThroughAuthorizationHandler.HandleAsync(AuthorizationHandlerContext context) at Microsoft.AspNetCore.Authorization.DefaultAuthorizationService.AuthorizeAsync(ClaimsPrincipal user, Object resource, IEnumerable 1 требования) в Microsoft.AspNetCore.Components.AuthorizeViewCore.IsAuthorizedAsync (ClaimsPrincipal пользователь) в Microsoft.AspNetCore.Components.AuthorizeViewCore.OnParametersSetAsync () в Microsoft.AspNetCore.Components.ComponentBase.CallStateHasChangedOnAsyncCompletion (Task задача) в Microsoft.AspNetCore.Components.ComponentBase.RunInitAndSetParametersAsync ()

Ответы [ 2 ]

0 голосов
/ 02 июля 2019

У меня та же проблема - приложение Blazor с .Net Core 3.0-preview 6.

Я использую пользовательский AuthorizationHandler вместе с Identity Framework.Ошибка выдается внутри HandleRequirementAsync при попытке прочитать имя текущего пользователя с помощью context.User.Identity.Name.

0 голосов
/ 18 июня 2019

Попробуйте этот фрагмент кода и посмотрите, работает ли он для вас:

@attribute [Authorize(Roles = "admin, superuser")]

Если это так, вы должны использовать:

@attribute [Authorize(Roles = "Domain Users")]

Пожалуйста, отобразите содержимоевашего класса Startup

Надеюсь, это поможет ...

...