AuthorizeAttribute认证失败Redirect后依旧会进入Action

本文介绍了在MVC框架中重写AuthorizeAttribute时遇到的问题及解决方法。作者分享了如何正确地处理未授权请求并跳转到登录页面的过程,并提到了在Action中获取用户信息时可能遇到的NULL值问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

MVC中AuthorizeAttribute重写后,认证失败,要跳到登陆页面HandleUnauthorizedRequest中是这样写的

filterContext.HttpContext.Response
    .Redirect("/Account/Login?returnUrl=" + 
    HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.ToString()));

然后在Action里因为要使用用户信息,结果用户信息为NULL结果触发了异常。有人说Redirect要加个true,我也加了,不过没用。

原来人家自己提供了跳转的方法

filterContext.Result = new RedirectResult("/Account/Login?returnUrl=" + 
    HttpUtility.UrlEncode(filterContext.HttpContext.Request.Url.ToString()));

我就是这么笨,欢迎吐槽

在.NET Core 3.x版本中,如果你想要实现一个自定义的`AuthorizeAttribute`,通常会继承`Microsoft.AspNetCore.Authorization.AuthorizeAttribute`并覆盖其中的一些方法来满足特定的认证需求。下面是一个简单的示例,展示如何创建一个只允许拥有特定权限的自定义授权属性: ```csharp using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc.Filters; using System.Collections.Generic; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class CustomAuthorizeAttribute : AuthorizeAttribute { private readonly List<string> _requiredPermissions; public CustomAuthorizeAttribute(params string[] permissions) { _requiredPermissions = new List<string>(permissions); } protected override async Task OnAuthorizationAsync(AuthorizationFilterContext filterContext) { if (_requiredPermissions.Count > 0) { var user = await filterContext.HttpContext.User.AuthenticateAsync(); // 获取当前用户的权限信息 if (!user.Claims.Any(c => _requiredPermissions.Contains(c.Value))) // 检查用户是否具有所有所需的权限 { // 如果缺少权限,抛出未经授权异常 await filterContext.FailureAsync(new ForbidResult()); } } // 如果用户已通过权限检查,继续执行授权过程 await base.OnAuthorizationAsync(filterContext); } } // 使用自定义授权属性的示例 [CustomAuthorize(Permissions = "admin", "write")] public class MyController : ControllerBase { // 控制器方法... } ``` 在这个例子中,`_requiredPermissions`列表包含了必需的权限。当方法被授权过滤器拦截时,首先检查用户是否具有所有列出的权限,如果没有,则禁止访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值