我希望你们能为我提供帮助,我无法获得基于角色的授权才能在应用程序的首页加载中工作。
我正在编写带有自定义授权处理程序的服务器端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();
});
感谢您的时间!