核心 ASP.NET 中的自定义授权属性

本文关键字:自定义 授权 属性 ASP NET 核心 | 更新日期: 2023-09-27 17:55:51

我正在研究 asp.net 核心,但我不明白一些事情。例如,在 mvc.net 5 中,我们可以从 AuthorizeAttribute 使用 Create 类过滤和授权操作,并将属性设置为如下所示的操作:

public class AdminAuthorize : AuthorizeAttribute {
        public override void OnAuthorization(AuthorizationContext filterContext) {
            base.OnAuthorization(filterContext);
            if (filterContext.Result is HttpUnauthorizedResult)
                filterContext.Result = new RedirectResult("/Admin/Account/Login");
        }
    }

但是在 asp.net 核心中,我们没有授权属性...如何在 asp.net 核心中为自定义操作设置这样的过滤器?

核心 ASP.NET 中的自定义授权属性

您可以使用身份验证中间件和Authorize属性来重定向登录页面。对于您的情况,使用AuthenticationScheme似乎是合理的。

第一次使用(我假设你想使用 cookie 中间件)cookie 身份验证中间件:

        app.UseCookieAuthentication(new CookieAuthenticationOptions()
        {
            AuthenticationScheme = "AdminCookieScheme",
            LoginPath = new PathString("/Admin/Account/Login/"),
            AccessDeniedPath = new PathString("/Admin/Account/Forbidden/"),
            AutomaticAuthenticate = true,
            AutomaticChallenge = true,
            CookieName="AdminCookies"
        });

然后将Authorize属性与此方案一起使用:

[Authorize(ActiveAuthenticationSchemes = "AdminCookieScheme")]

另一个选项是使用 UseWhen 将管理员身份验证和默认身份验证分开:

      app.UseWhen(x => x.Request.Path.Value.StartsWith("/Admin"), builder =>
      {
          builder.UseCookieAuthentication(new CookieAuthenticationOptions()
          {
              LoginPath = new PathString("/Admin/Account/Login/"),
              AccessDeniedPath = new PathString("/Admin/Account/Forbidden/"),
              AutomaticAuthenticate = true,
              AutomaticChallenge = true
          });
      });

然后只使用Authorize属性。