C# 扩展身份验证属性(ASP.NET 核心 6)
C# Extending the Authenticate Attribute (ASP.NET Core 6)
我需要在用户验证后在请求中添加一个标志 HttpContext.Items.Add("Flag","FlagValue")
。我已经使用单独的 ActionFilterAttribute
完成了类似的任务,但想通过扩展或覆盖 AuthorizeAttribute
.
来完成
我知道这可以通过创建自定义授权属性来完成,我在网上查看了很多示例,但我发现的示例似乎在 ASP.NET Core 6 中不起作用MVC.
我开始了一些简单的事情,看看它是否通过了身份验证
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class AuthorizeUserAttribute : AuthorizeAttribute
{
public AuthorizeUserAttribute()
{
Log.Information("Authenticated?"); // stops here
}
public AuthorizeUserAttribute(string policy) : base(policy)
{
Log.Information("Authenticated?"); // doesn't stop here
}
}
并且正在对我创建的策略进行身份验证和检查。
[CheckIsAppLocked]
[HttpGet("connections")]
[AuthorizeUser(Policy = "App_User")]
public ActionResult<Packet<List<SFTP_Conn_Info>>> GetConnInfo()
{
return OK(HomeLogic.GetConnInfo());
}
我的问题是无法进入 HttpContext
class。我不知道我可以使用 AuthorizeAttribute
公开的方法,我什至尝试使用 HttpContextAccessor
class 但它 returns null (但是当与动作过滤器一起使用时不为空)
我可以调用操作过滤器 OnActionExecuting(ActionExecutingContext actionContext)
并引用 actionContext.HttpContext class。
我猜我需要在我的 AuthorizeAttribute 中定义一个方法,但不确定 .NET 6 支持哪个方法。
感谢帮助!
如果您在定义的属性上实现 IActionFilter
接口,您应该能够访问 HttpContext
,正如您在操作的声明属性中提到的那样。
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class AuthorizeUserAttribute : AuthorizeAttribute, IActionFilter {
public void OnActionExecuted(ActionExecutedContext context) {}
public void OnActionExecuting(ActionExecutingContext actionContext) {
actionContext.HttpContext.Items.Add("Flag", GetFlagValue());
}
}
我需要在用户验证后在请求中添加一个标志 HttpContext.Items.Add("Flag","FlagValue")
。我已经使用单独的 ActionFilterAttribute
完成了类似的任务,但想通过扩展或覆盖 AuthorizeAttribute
.
我知道这可以通过创建自定义授权属性来完成,我在网上查看了很多示例,但我发现的示例似乎在 ASP.NET Core 6 中不起作用MVC.
我开始了一些简单的事情,看看它是否通过了身份验证
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class AuthorizeUserAttribute : AuthorizeAttribute
{
public AuthorizeUserAttribute()
{
Log.Information("Authenticated?"); // stops here
}
public AuthorizeUserAttribute(string policy) : base(policy)
{
Log.Information("Authenticated?"); // doesn't stop here
}
}
并且正在对我创建的策略进行身份验证和检查。
[CheckIsAppLocked]
[HttpGet("connections")]
[AuthorizeUser(Policy = "App_User")]
public ActionResult<Packet<List<SFTP_Conn_Info>>> GetConnInfo()
{
return OK(HomeLogic.GetConnInfo());
}
我的问题是无法进入 HttpContext
class。我不知道我可以使用 AuthorizeAttribute
公开的方法,我什至尝试使用 HttpContextAccessor
class 但它 returns null (但是当与动作过滤器一起使用时不为空)
我可以调用操作过滤器 OnActionExecuting(ActionExecutingContext actionContext)
并引用 actionContext.HttpContext class。
我猜我需要在我的 AuthorizeAttribute 中定义一个方法,但不确定 .NET 6 支持哪个方法。
感谢帮助!
如果您在定义的属性上实现 IActionFilter
接口,您应该能够访问 HttpContext
,正如您在操作的声明属性中提到的那样。
[AttributeUsage(AttributeTargets.All, AllowMultiple = false, Inherited = true)]
public class AuthorizeUserAttribute : AuthorizeAttribute, IActionFilter {
public void OnActionExecuted(ActionExecutedContext context) {}
public void OnActionExecuting(ActionExecutingContext actionContext) {
actionContext.HttpContext.Items.Add("Flag", GetFlagValue());
}
}