Tôi đang đấu tranh với ASP.NET MVC 6 (bản beta 4 phát hành) cố gắng tiêm một dịch vụ trong một thuộc tính bộ lọc điều khiển loại AuthorizationFilterAttribute
.Tiêm phụ thuộc bên trong một FilterAttribute trong ASP.NET MVC 6
Đây là dịch vụ (nó đã một dịch vụ khác tiêm)
public class UsersTableRepository
{
private readonly NeurosgarContext _dbContext;
public UsersTableRepository(NeurosgarContext DbContext)
{
_dbContext = DbContext;
}
public ICollection<User> AllUsers
{
get
{
return _dbContext.Users.ToList();
}
}
//other stuff...
}
Đây là phương pháp ConfigureServices trong Startup lớp cho các dịch vụ cho phép
public void ConfigureServices(IServiceCollection services)
{
//...
services.AddSingleton<NeurosgarContext>(a => NeurosgarContextFactory.GetContext());
services.AddSingleton<UifTableRepository<Nazione>>();
services.AddSingleton<UsersTableRepository>();
}
Một đơn giản "giả" điều khiển với hai bộ lọc được xác định trên đó. Bạn có thể nhận thấy rằng tôi đã thực hiện DI bên trong bộ điều khiển này bằng cách trang trí thuộc tính với [FromServices]
và nó hoạt động.
[Route("[controller]")]
[BasicAuthenticationFilter(Order = 0)]
[BasicAuthorizationFilter("Admin", Order = 1)]
public class DummyController : Controller
{
[FromServices]
public UsersTableRepository UsersRepository { get; set; }
// GET: /<controller>/
[Route("[action]")]
public IActionResult Index()
{
return View();
}
}
Làm DI cùng trong BasicAuthenticationFilter
không làm việc và trong thời gian chạy UserRepository
tài sản là một tham chiếu null.
public class BasicAuthenticationFilterAttribute : AuthorizationFilterAttribute
{
[FromServices]
public UsersTableRepository UsersRepository { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!Authenticate(filterContext.HttpContext))
{
// 401 Response
var result = new HttpUnauthorizedResult();
// Add the header for Basic authentication require
filterContext.HttpContext.Response.Headers.Append("WWW-Authenticate", "Basic");
filterContext.Result = result;
//if (!HasAllowAnonymous(context))
//{
// base.Fail(context);
//}
}
}
// ...
}
Bất kỳ ý tưởng nào về cách giải quyết vấn đề này?
Vấn đề là nếu tôi sử dụng một hàm tạo trong bộ lọc để tiêm dịch vụ tôi không thể đánh chặn cá thể thuộc tính. –
Đó là vì bạn không nên tiêm phụ thuộc vào các thuộc tính của bạn. Vui lòng đọc kỹ các bài viết được tham chiếu. – Steven
Cảm ơn bạn. Tôi sẽ làm nó! –