如何在 ASP.NET Core 中重写 HandleUnauthorizedRequest

2023-12-30

我正在将项目迁移到 asp.net core,但我一直在迁移控制器的自定义授权属性。这是我的代码。

public class CustomAuthorization : AuthorizeAttribute
{
    public string Url { get; set; }

    protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext)
    {
        if (!filterContext.HttpContext.User.Identity.IsAuthenticated)
        {
            filterContext.Result = new RedirectResult(Url + "?returnUrl=" + filterContext.HttpContext.Request.Url.PathAndQuery);
        }
        else if (!Roles.Split(',').Any(filterContext.HttpContext.User.IsInRole))
        {
            filterContext.Result = new ViewResult
            {
                ViewName = "AcessDenied"
            };
        }
        else
        {
            base.HandleUnauthorizedRequest(filterContext);
        }
    }
}

然后我用它来我的控制器

[CustomAuthorization(Url = "/Admin/Account/Login", Roles = "Admin")]
public abstract class AdminController : Controller { }

所以,基本上我可以在不满足角色时使用它重定向到不同的登录页面。我有几个区域,每个区域都有不同的登录页面。我尝试使用Cookie身份验证选项像这样

services.Configure<CookieAuthenticationOptions>(options =>
{
    options.AuthenticationScheme = "Admin";
    options.LoginPath = "/Admin/Account/Login";
});

然后在我的管理控制器上

[Area("Admin")]
[Authorize(ActiveAuthenticationSchemes = "Admin", Roles = "Admin")]

但是登录后还是进不去。


我正在我的一个项目中做类似的事情。这个答案不使用 AuthorizeAttribute;但它可能会帮助一些人从谷歌搜索登陆这里。 就我而言,我使用它根据自定义逻辑进行授权。

首先是我的自定义属性类:

public class CustomAuthorizationAttribute : ActionFilterAttribute
{
    private readonly IMyDepedency _dp;
    public CustomAuthorizationAttribute(IMyDepedency dp)
    {
        _dp = dp;
    }
    public override void OnActionExecuting(ActionExecutingContext context)
    {
        var isValid = false;
       //write my validation and authorization logic here 
        if(!isValid)
        {
            var unauthResult = new UnauthorizedResult();

            context.Result = unauthResult;                
        }

        base.OnActionExecuting(context);
    }
}

我这样装饰我的控制器:

[ServiceFilter(typeof (CustomAuthorizationAttribute))]

然后在我的启动课程中

public void ConfigureServices(IServiceCollection services)
{
     // Add framework services.
     services.AddMvc();

   // my other stuff that is not relevant in this post

     // Security
     services.AddTransient<CustomAuthorizationAttribute>();
 }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 ASP.NET Core 中重写 HandleUnauthorizedRequest 的相关文章

随机推荐

  • 使用 api v2 创建 Facebook 事件

    可以使用 Facebook API 创建事件吗 API v1 中可以实现 https developers facebook com docs graph api reference v1 0 event publish https dev
  • 需要在ARCORE中播放视频

    正如我们在 ARCore 中所知 我们可以通过单击水平面来检测 3D 对象 而不是 3d 对象 当用户要单击平面时 我需要显示视频 外观和感觉应该与显示的 3D 对象相同 视频应以预览模式显示 而不是 3D 对象 在 ARcore 中 他们
  • OpenGL 中的纹理贴图

    我在使 mipmap 正常工作时遇到了很多麻烦 我使用的是 OpenGL 1 1 并且没有 glu 因此我使用以下纹理启动代码 glGenTextures 1 texname glBindTexture GL TEXTURE 2D texn
  • 错误:无法找到 conda 二进制文件。 Anaconda安装了吗?网状Rstudio [重复]

    这个问题在这里已经有答案了 我通过 Rstudio 安装了 reticulate 现在我想用conda create 但我将 anaconda 安装在另一个目录中 然后是默认目录 如何更改 Rstudio 搜索 anaconda 的目录 E
  • 动态计算字段中的字符数

    我想动态计算表单文本区域字段中的字符 我知道有一个类似的问题 但我想知道它是否可以从某个数字向 0 计数 例如在 Twitter 上写推文时 这段代码可以是 javascript PHP 这对我来说并不重要 这应该可以帮助你 这里有一个tu
  • 如何让discord.py 机器人向非作者的人发送私人/直接消息?

    假设我想制作一个具有 poke 功能的机器人 又名当有人说 poke user 0000 时向用户发送一条说 Boop 的消息 我该怎么做 当我这样做时它工作得很好 bot command pass context True async d
  • 无法读取用户的字符[重复]

    这个问题在这里已经有答案了 在这段代码中 我正在创建一个二叉树 直到用户想要节点数 但是在从用户获取输入时 它在某个地方失败了 struct node createTree struct node root int n char ch st
  • 如何使用 PHP 和 GD 解决字体花饰问题

    我有以下代码可以在图像上打印文本 我还在文本周围添加了一个调试框 然而 我注意到左侧的文本位于 PHP 给我的框之外imagettfbbox 这看起来像是字体花饰的问题 有什么办法可以解释这一点吗 我能算出斜盘起点和实际位置之间的距离吗im
  • 为什么在使用此 xpath 语法时会收到已弃用的警告?

    我正在使用 selenium 打印网页上的所有产品链接 这是我的代码 from selenium webdriver import Chrome driver path PATH r C Users David Desktop Seleni
  • 如何在android中使用sqlite连接表

    我试图找出如何在 Android 应用程序中使用 sqlite 数据库在我的两个表上进行简单的表连接 使用 CursorJoiner 是最简单的方法还是有更简单的方法 在实施中SQLite数据库 http android git kerne
  • Angular CLI 6 未知选项:“--singleRun”

    当我想执行测试时 我可以选择 single run已激活 但升级到 Angular 6 后不再被识别 gt ng test source map false single run no progress browsers ChromeNoS
  • PHP 无法通过 COM 打开 Excel 工作簿

    该代码工作正常 直到到达打开的工作簿行 然后失败
  • 如何创建扩展方法 (F#)? [复制]

    这个问题在这里已经有答案了 如何在 F 中创建扩展方法 例如 如下 C 扩展 public static string Right this string host int index return host Substring host
  • 将 HTML 分成页面,分割长段落

    好吧 我什至不确定这是否可以用我当前的方法来完成 我正在尝试将 HTML 文档的内容放入当前视口大小的页面中 我目前正在通过迭代文档的所有元素并检查它们的顶部偏移量是否在当前页面的边界内来执行此操作 只要不在当前页面的边界内 此偏移量就会成
  • Typescript:是否有一种简单的方法将一种类型的对象数组转换为另一种类型

    所以 我有两节课 Item name string desc string meta string ViewItem name string desc string hidden boolean 我有一个 Item 数组需要转换为 View
  • 实体方面(春季)

    我在定义我的方面时遇到了一些问题 我有一堆实体 我想在其中分析 get methods 所以我编写了以下切入点和方法 Pointcut execution tld myproject data entities get public voi
  • 在运行时创建/修改枚举

    我正在创建一个程序 用户可以选择创建自己的自定义属性 这些属性最终将显示在PropertyGrid 现在我不想搞乱自定义编辑器 所以我只允许原始类型属性 string int double DateTime bool等 PropertyGr
  • 无闪烁文本框

    我的表单上有一个简单的 Winforms 多行文本框 每当我调整文本框的大小或移动文本框时 它的内容就会开始疯狂地闪烁 这看起来非常恶心 甚至可能导致某些用户癫痫发作 有没有办法操纵文本框的重绘过程来消除闪烁 我找到了一个工作解决方案 ht
  • 连接到 SQL Server 2008 的最大并发用户数

    连接到 SQL Server 2008 的最大并发用户数是否有限制 我猜测计算机资源决定了该限制 如果存在 但我也想知道是否存在理论上的限制 我尝试用谷歌搜索答案 但我找到的所有信息都是基于 SQL Server 的早期版本 如果有限制 它
  • 如何在 ASP.NET Core 中重写 HandleUnauthorizedRequest

    我正在将项目迁移到 asp net core 但我一直在迁移控制器的自定义授权属性 这是我的代码 public class CustomAuthorization AuthorizeAttribute public string Url g