如何在 dotnet core 中制作自定义身份验证过滤器,如 Iauthentication

Posted

技术标签:

【中文标题】如何在 dotnet core 中制作自定义身份验证过滤器,如 Iauthentication【英文标题】:How to make custom Authentication filter like Iauthentication in dotnet core 【发布时间】:2021-08-26 05:09:36 【问题描述】:

我正在将 asp.net mvc 迁移到 dotnet 3.1,在较旧的应用程序中,我们现在在 dotnet 3.1 中使用 IAuthorization 和 IAuthentication 过滤器,我们有 IAuthorization 过滤器,但没有 IAuthentication。 请建议在 dotnet core 3.1 中制作自定义身份验证过滤器的方法。 我们正在使用身份验证方法 OnAuthentication。

public void OnAuthentication(AuthenticationContext filterContext)
        
        if (System.Web.HttpContext.Current.Session.GetString("SUserID") == null && ConfigurationManager.AppSettings["Authentication"] == "Yes")
            
                if(!(filterContext.ActionDescriptor.ActionName== "AuthRequest" || filterContext.ActionDescriptor.ActionName == "AuthResponse" || filterContext.ActionDescriptor.ActionName == "Sessiontimeout"))
                filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new  controller = "Home", action = "AuthRequest", area = string.Empty ));
       

【问题讨论】:

【参考方案1】:

你可以像这样实现过滤器:

  public class CustomAuthorizeFilter : ActionFilterAttribute
     

        public override void OnActionExecuting(ActionExecutingContext context)
        
            //check IsAjax request or not
            var ajax = context.HttpContext.Request.IsAjaxRequest();

            //IsAuthenticated
            var result = context.HttpContext.User.Identity.IsAuthenticated;

            //check user is in role
            var isInRole = context.HttpContext.User.IsInRole(YourRoleName);

            //get action and  controller Name
            var currentContext = context.Resource as AuthorizationFilterContext;
            var descriptor = currentContext?.ActionDescriptor as ControllerActionDescriptor;
            if (descriptor != null)
            
                var actionName = descriptor.ActionName;
                var ctrlName = descriptor.ControllerName;
            

            //and etc
        
    

您可以在 OnActionExecuting 中授权您的用户,而对于读取会话,您可以使用 HttpContextAccessor。这是good sample

【讨论】:

以上是关于如何在 dotnet core 中制作自定义身份验证过滤器,如 Iauthentication的主要内容,如果未能解决你的问题,请参考以下文章

在 IdentityServer4 和 Dotnet Core Identity 中使用带有身份验证 (oidc) 的 sms otp

如何在启动时使用 dotnet core 3 中的依赖项调用自定义服务?

unbuntu(18.04)下体验dotnet core

DotNet Core:如何跨平台客户端证书 TLS 身份验证?

使用路由参数的 DotNet Core 自定义授权属性

Web api dotnet core 中的 Api 版本控制错误的自定义错误响应