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相关问答推荐

AJAX返回未定义、失败

如何在 ASP.NET RadioButtonList 中的项目之间添加空格

如何在 C#/MVC 4 中的 Html.TextBoxFor 中输入占位符文本

Azure 自定义控制器/API .Net 后端

asp.net、url 重写模块和 web.config

'Access-Control-Allow-Origin' 标头包含多个值 '*, *',但只允许一个

有没有办法将 onclick 事件添加到 ASP.NET 标签服务器控件?

如何更改 .ASPX 自动格式化设置 (Visual Studio)

如何使用 javascript 调用 ASP.NET c# 方法

在 ASP.NET MVC 中使用 Razor 创建可重用的 HTML 视图组件

在生产中使用 LocalDb 是否正常?

如何获得 System.Diagnostics.Process 的输出?

MVC 4 - Razor - 将变量传递到 href url

对于 DB ID,需要一个较小的 GUID 替代方案,但对于 URL 仍然是唯一且随机的

Twitter Bootstrap 和 ASP.NET GridView

ASP.NET 身份提供程序 SignInManager 不断返回失败

GridView 按代码隐藏列

在 Visual Studio 2013 中更改项目端口号

DataTable 不包含 AsEnumerable 的定义

在 ASP.NET 中使用 SecureString 有什么好处吗?