【发布时间】:2020-08-16 03:37:44
【问题描述】:
我正在编写一个 blazor 站点,该站点需要允许基于预先存在的 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 模型。为了让事情更简单,我暂时删除了除编辑器声明之外的所有内容。
以下是我的配置服务:
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"));
});
谁能指出我正确的方向?
【问题讨论】:
标签: authorization blazor-server-side asp.net-core-3.1