AuthenticationRequiredAttribute Class

public class AuthenticationRequiredAttribute : ActionFilterAttribute
{
    ILoginTokenKeyApi _loginTokenKeyApi;
    IMemoryCache _memoryCache;

    public AuthenticationRequiredAttribute(IMemoryCache memoryCache)
    {
        _memoryCache = memoryCache;

        _loginTokenKeyApi = new LoginTokenKeyController(new UnitOfWork());
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var memory = _memoryCache.Get(Constants.KEYNAME_FOR_AUTHENTICATED_PAGES);

        string requestedPath = filterContext.HttpContext.Request.Path;

        string tokenKey = filterContext.HttpContext.Session.GetString("TokenKey")?.ToString();

        bool? isLoggedIn = _loginTokenKeyApi.IsLoggedInByTokenKey(tokenKey).Data;

        if (isLoggedIn == null ||
            !((bool)isLoggedIn) ||
            !Constants.AUTHENTICATED_PAGES_FOR_NORMAL_USERS.Contains(requestedPath))
        {
            filterContext.Result = new JsonResult(new { HttpStatusCode.Unauthorized });
        }
    }
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
    }
}

HomeController

public class HomeController : Controller
{
    IUserApi _userApi;
    ILoginTokenKeyApi _loginTokenKey;
    IMemoryCache _memoryCache;

    public HomeController(IUserApi userApi, ILoginTokenKeyApi loginTokenKey, IMemoryCache memoryCache)
    {
        _loginTokenKey = loginTokenKey;
        _userApi = userApi;

        _memoryCache = memoryCache;
    }

    [AuthenticationRequired] // There is AN ERROR !!
    public IActionResult Example()
    {
        return View();
    }
}

错误:

错误CS7036没有给定的参数对应于 的必需形式参数""memory yCache"" ‘AuthenticationRequiredAttribute.AuthenticationRequiredAttribute(IMemoryCache)’项目.Ground.WebUI

My problem is actually : I cant use dependency injection in attribute classes美元.

我想不带任何参数地使用该属性.有什么解决办法吗?我使用依赖注入,但它不能用于属性.我如何使用它?

推荐答案

ActionExecutingContext.HttpContext.RequestServices应该在请求时提供对请求的服务容器的引用,而不是在构造时解析.

所以:

public override void OnActionExecuting(ActionExecutingContext filterContext)
{
    var svc = filterContext.HttpContext.RequestServices;
    var memCache = svc.GetService<IMemoryCache>();
    //..etc

Asp.net相关问答推荐

使用 Asp.Net MVC 和 KnockoutJS 处理日期

ASP.NET 核心中的 Request.CreateResponse

在 ASP.NET 中访问没有值的查询字符串参数

在 RedirectToAction 调用中传播 QueryString 参数

HttpContext.Current.Request.IsAuthenticated 和 HttpContext.Current.User.Identity.IsAuthenticated 有什么区别?

在 C# 中将 IHtmlContent/TagBuilder 转换为字符串

使用 Visual Studio 2012 恢复删除的文件

为什么 Asp.Net Identity IdentityDbContext 是一个黑盒?

HttpContext.Current.Cache.Insert 和 HttpContext.Current.Cache.Add 有什么区别

如何为角色以及特定用户使用自定义授权属性?

ASP.NET 中的 <%# Bind("") %> 和 <%# Eval("") %> 有什么区别?

在 ApiController 中添加自定义响应头

解析器错误消息:无法加载类型网络营销

HttpContext.Current 在 MVC 4 项目中未解决

Web API 必填参数

如何进入 IIS 管理器?

简单的 LINQ 和列表错误:WhereListIterator`1[Task]' to type 'System.Collections.Generic.List`1[Task]'

在 ASP.NET Web API 2 中禁用 *all* 异常处理(为我自己腾出空间)?

配置授权服务器端点

获取 POST 变量