.NET Core 7中如何限制未搭建的Identity页面访问权限?
解决.NET Core 7 Identity未搭建页面仍可访问的问题
问题原因
你遇到的情况是因为.NET Core Identity的默认UI内置了所有管理页面的路由和视图,哪怕你没有在本地生成对应的.cshtml文件,框架依然会使用内置视图响应请求。ManageNavPages.cs仅用于管理导航菜单的激活状态——修改这个文件只会隐藏导航栏入口,无法阻止用户通过直接输入URL访问页面,和页面的可访问权限完全无关。
解决方法
方法一:生成并修改/删除本地页面文件
- 执行以下命令生成
PersonalData页面的本地文件:dotnet aspnet-codegenerator identity -dc Social_Media_App.Data.ApplicationDbContext --files Account.Manage.PersonalData - 生成后可选择两种处理方式:
- 限制访问权限:在
PersonalData.cshtml.cs的页面模型类上添加授权特性,比如仅允许管理员访问:[Authorize(Roles = "Admin")] public class PersonalDataModel : PageModel { // 原有代码... } - 直接禁用页面:删除生成的
PersonalData.cshtml和PersonalData.cshtml.cs文件,用户访问该URL时会返回404错误。
- 限制访问权限:在
方法二:通过路由规则拦截访问
若不想生成本地文件,可直接在Program.cs中添加路由规则拦截请求:
app.UseEndpoints(endpoints => { // 保留原有路由配置 endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); // 拦截PersonalData页面请求,返回404 endpoints.Map("/Identity/Account/Manage/PersonalData", context => { context.Response.StatusCode = StatusCodes.Status404NotFound; return Task.CompletedTask; }); });
如果仅需禁止未登录用户访问(登录用户仍可访问),可给路由添加授权要求:
endpoints.Map("/Identity/Account/Manage/PersonalData", context => { context.Response.StatusCode = StatusCodes.Status404NotFound; return Task.CompletedTask; }).RequireAuthorization();
方法三:自定义Identity UI(进阶)
若需完全控制Identity页面集合,可在配置Identity时替换默认UI,仅包含你需要的页面(此方法较繁琐,适合大量自定义场景):
builder.Services.AddIdentity<IdentityUser, IdentityRole>(options => options.SignIn.RequireConfirmedAccount = true) .AddEntityFrameworkStores<ApplicationDbContext>() .AddTokenProvider<DataProtectorTokenProvider<IdentityUser>>(TokenOptions.DefaultProvider); // 不再使用AddDefaultUI,手动添加所需页面路由
内容的提问来源于stack exchange,提问作者Alexander Nedelchev
相关产品推荐
相关产品推荐

