.NET Core 2.1 Identity as UI如何安全取消注册选项?
嘿,我来帮你把这个问题理清楚——直接移除页面上的Register按钮绝对不安全,懂吧?因为懂行的用户完全可以手动在地址栏敲入注册页面的路由(比如/Identity/Account/Register),直接绕过前端的隐藏操作;恶意用户甚至能通过API调用注册接口,照样能创建账号。
正确的禁用方案
我给你分两种场景说,你可以根据自己的需求选:
方案1:不用Scaffold,轻量拦截(适合不想动Identity源码的情况)
说白了就是从路由和配置层面堵死注册的入口:
- 拦截注册路由:在
Startup.cs的Configure方法里加个中间件,把所有访问注册页面的请求直接重定向到登录页:
app.Use(async (context, next) => { // 拦截注册和注册确认的路由 if (context.Request.Path.StartsWithSegments("/Identity/Account/Register") || context.Request.Path.StartsWithSegments("/Identity/Account/RegisterConfirmation")) { context.Response.Redirect("/Identity/Account/Login"); return; } await next(); });
- 隐藏前端入口:同时别忘了把
_LoginPartial.cshtml里的Register链接删掉,这样普通用户连入口都看不到
方案2:Scaffold生成代码,彻底锁死(适合需要精细控制的场景)
如果你想连后端的注册逻辑都彻底关掉,那最好用Scaffold把Identity的Register相关代码生成出来:
- 在Visual Studio里右键项目→「添加」→「新建搭建基架项」→选「Identity」,然后勾选Register、RegisterConfirmation这些相关页面
- 生成代码后,打开
Register.cshtml.cs,把OnPostAsync方法直接改成重定向或者返回错误:
public async Task<IActionResult> OnPostAsync(string returnUrl = null) { returnUrl ??= Url.Content("~/"); // 直接禁用注册,跳回登录页 return LocalRedirect(returnUrl); // 要是想给用户提示,也可以这么写: // ModelState.AddModelError(string.Empty, "注册功能已禁用"); // return Page(); }
- 最后可以把
Register.cshtml里的表单删掉,改成提示“注册已禁用”的静态内容就行
关于SetPassword这类功能的处理
思路和禁用Register完全一样:
- 先从路由层面拦截,防止用户直接访问对应的页面
- 再把前端的入口链接删掉
- 要是需要彻底禁用后端逻辑,就用Scaffold生成对应的页面代码,修改后端方法直接返回重定向或错误
内容的提问来源于stack exchange,提问作者kofifus
相关产品推荐
相关产品推荐

