基于Identity框架,如何修改[Authorize]特性的默认重定向行为?
解决未授权用户重定向至注册页的简便方案
嘿,这个需求太贴合新产品初期的场景了!你完全不用折腾复杂的中间件,有两个超简便的实现方式,看你需求选就行:
方案一:自定义授权特性(灵活适配部分页面)
如果只是部分页面需要跳转到注册页,其他页面后续可能还要跳登录,那自定义一个继承自AuthorizeAttribute的特性就很合适,直接重写未授权的处理逻辑:
using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; public class RedirectToRegisterAttribute : AuthorizeAttribute, IAuthorizationFilter { public void OnAuthorization(AuthorizationFilterContext context) { // 检查用户是否未认证 if (!context.HttpContext.User.Identity.IsAuthenticated) { // 重定向到注册页的Action context.Result = new RedirectToActionResult("Index", "Register", null); } } }
之后把原来的[Authorize]替换成[RedirectToRegister]就行,比如:
[RedirectToRegister] public IActionResult Dashboard() { return View(); }
方案二:全局配置身份验证跳转(适合全场景)
如果你的新产品现阶段所有未授权请求都需要跳注册,那直接在身份验证的配置里修改跳转路径就完事了,一步到位:
在Program.cs(或Startup.cs)中配置:
using Microsoft.AspNetCore.Authentication.Cookies; var builder = WebApplication.CreateBuilder(args); // 添加身份验证服务 builder.Services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme) .AddCookie(options => { // 将默认的登录路径替换为注册页 options.LoginPath = "/Register/Index"; // 如果有访问被拒绝的场景,也可以指向注册页 options.AccessDeniedPath = "/Register/Index"; }); // 记得添加授权服务 builder.Services.AddAuthorization(); var app = builder.Build(); // 启用身份验证和授权中间件 app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();
这样所有标记了[Authorize]的页面,未授权用户访问时都会自动跳转到注册页,完全不用改现有特性的使用。
内容的提问来源于stack exchange,提问作者Louie Bacaj
相关产品推荐
相关产品推荐

