页面加载时基于角色的Blazor授权

时间:2020-07-09 23:44:18

标签: authentication blazor roles

我希望你们能为我提供帮助,我无法获得基于角色的授权才能在应用程序的首页加载中工作。

我正在编写带有自定义授权处理程序的服务器端blazor应用程序,在该应用程序中,我向用户身份对象添加了角色声明,并且效果很好。

在我的剃须刀页面中,我设置了[Authorize]属性,如果用户通过了验证,该属性将显示该页面。

但是,如果我向[Authorize(Roles =“ User”)]之类的属性添加角色,则页面刷新失败,单击应用程序中的另一个菜单项,然后似乎正确地应用了角色,然后它就起作用了。

在App.razor文件中,我放置了一个断点并检查了context.User.Identity,以发现尚未添加声明。

<NotAuthorized>
  @if (context.User.Identity.IsAuthenticated)
    {
      <p>You do not have sufficient rights to view this page...</p>
    }
    else
    {
      <NotLoggedIn></NotLoggedIn>
    }
 </NotAuthorized>

我的自定义授权处理程序仅在此之后添加角色声明。

我已经更改了startup.cs文件中请求管道的顺序,如下所示:

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            else
            {
                app.UseExceptionHandler("/Error");
                app.UseHsts();
            }

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

            app.UseRouting();

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

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

ConfigureServices中的代码如下:

services.AddAuthentication(x =>
            {
                x.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
                x.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
            })
            .AddJwtBearer(x =>
            {
                x.RequireHttpsMetadata = false;
                x.SaveToken = true;
                x.TokenValidationParameters = new TokenValidationParameters
                {
                    ValidateIssuerSigningKey = true,
                    IssuerSigningKey = signingKey,
                    ValidateIssuer = false,
                    ValidateAudience = false
                };
            });

            services.AddAuthorization(options =>
            {
                var defaultAuthorizationPolicyBuilder = new AuthorizationPolicyBuilder(JwtBearerDefaults.AuthenticationScheme, "Bearer");
                defaultAuthorizationPolicyBuilder = defaultAuthorizationPolicyBuilder.RequireAuthenticatedUser();
                defaultAuthorizationPolicyBuilder.AddRequirements(new AppSettingsAuthRequirement(Configuration));
                options.DefaultPolicy = defaultAuthorizationPolicyBuilder.Build();
            });

感谢您的时间!

0 个答案:

没有答案