#asp.net-core #asp.net-identity #blazor #roles #asp.net-roles
#asp.сетевое ядро #asp.net-идентификация #блейзор #роли #asp.net-роли
Вопрос:
Я пытаюсь ввести учетную запись администратора в свой проект. Я обновил файл Startup.cs для использования ролей, добавил администратора и стандартную учетную запись внутри AspNetRoles и назначил пользователя, используя его идентификатор пользователя, администратором. Соответствующая [Авторизация(Роль = «Администратор»)] также была добавлена на страницу, но учетной записи администратора по-прежнему отказано в доступе. Я, кажется, не могу понять, что является причиной того, что это не распознается, я искал похожие сообщения, в которых предлагалось реализовать
.AddRoleManagerlt;RoleManagerlt;IdentityRolegt;gt;()
Однако и это, похоже, не помогло. Был бы признателен за любое понимание в решении этой проблемы. Используя Blazor wasm. Заранее спасибо.
Startup.cs
запуск общедоступного класса { запуск общедоступного класса(конфигурация конфигурации значков) { Конфигурация = конфигурация; }
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.AddDbContextlt;ApplicationDbContextgt;(options =gt; options.UseSqlServer( Configuration.GetConnectionString("DefaultConnection"))); services.AddDatabaseDeveloperPageExceptionFilter(); services.AddDefaultIdentitylt;ApplicationUsergt;(options =gt; options.SignIn.RequireConfirmedAccount = false) .AddRoleslt;IdentityRolegt;() .AddEntityFrameworkStoreslt;ApplicationDbContextgt;(); services.AddIdentityServer() .AddApiAuthorizationlt;ApplicationUser, ApplicationDbContextgt;(); services.AddAuthentication() .AddIdentityServerJwt(); services.AddControllersWithViews(); services.AddRazorPages(); services.Configurelt;IdentityOptionsgt;(options =gt; options.ClaimsIdentity.UserIdClaimType = ClaimTypes.NameIdentifier); services.AddControllers().AddNewtonsoftJson(x =gt; x.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Serialize); } // 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(); app.UseMigrationsEndPoint(); app.UseWebAssemblyDebugging(); } 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.UseHttpsRedirection(); app.UseBlazorFrameworkFiles(); app.UseStaticFiles(); app.UseRouting(); app.UseIdentityServer(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints =gt; { endpoints.MapRazorPages(); endpoints.MapControllers(); endpoints.MapFallbackToFile("index.html"); }); } }
Программа.cs
public class Program { public static void Main(string[] args) { CreateHostBuilder(args).Build().Run(); } public static IHostBuilder CreateHostBuilder(string[] args) =gt; Host.CreateDefaultBuilder(args) .ConfigureWebHostDefaults(webBuilder =gt; { webBuilder.UseStartuplt;Startupgt;(); }); }
Таблица AspNetRoles
Таблица AspNetUserRoles
Бритвенные страницы
@attribute [Authorize(Roles ="Admin")]
Несмотря на описанные выше реализации, при входе в назначенную учетную запись администратора отображается сообщение
You are not authorized to access this resource.
Комментарии:
1. Не могли бы вы, пожалуйста, отобразить полный код в классе запуска вашего сервера и в классе программы вашего клиента. Вы можете удалить его позже… Вы используете приложение для веб-сборки Blazor, размещенное правильно ? ( Клиент, Сервер, Общий доступ)
2. Конечно! Я обновил большинство, чтобы включить его, и да, веб-сборка Blazor размещена
Ответ №1:
Попробуйте сделать следующее…
Изменить:
services.AddIdentityServer() .AddApiAuthorizationlt;ApplicationUser, ApplicationDbContextgt;();
Для:
// Configure identity server to put the role claim into the id token // and the access token and prevent the default mapping for roles in // the JwtSecurityTokenHandler. services.AddIdentityServer() .AddApiAuthorizationlt;ApplicationUser, ApplicationDbContextgt;(options =gt; { options.IdentityResources["openid"].UserClaims.Add("role"); options.ApiResources.Single().UserClaims.Add("role"); }); // Need to do this as it maps "role" to ClaimTypes.Role and causes issues JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Remove("role");
Комментарии:
1. Это сработало! Большое вам спасибо. Я занимался этим несколько часов! Спасибо