c#扩展认证属性. 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类。我不知道我可以用AuthorizeAttribute暴露的方法,我甚至尝试使用HttpContextAccessor类,但它返回null(但当与动作过滤器一起使用时不是null)

我可以调用动作过滤器OnActionExecuting(ActionExecutingContext actionContext)并引用actionContext。HttpContext类。

我猜有一个方法我需要在我的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());
}
}

最新更新