Я пишу блаженный сайт, который должен разрешать доступ к определенным страницам на основе записей в уже существующей базе данных 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. На данный момент я удалил все, кроме заявления редактора, чтобы упростить задачу.
Ниже приведены мои ConfigureServices:
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"));
});
Может ли кто-нибудь указать мне правильное направление?