Я создаю пользовательскую авторизацию в ядре .net. Все работает совершенно нормально, но я хочу добавить локализатор в ответ атрибута.
Ниже мой код
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class CustomAuthorizeFilters : AuthorizeAttribute, IAuthorizationFilter
{
public CustomAuthorizeFilters()
{ }
public void OnAuthorization(AuthorizationFilterContext context)
{
var User = context.HttpContext.User;
if (!User.Identity.IsAuthenticated)
return;
using (var account_help = new AccountHelpers(Startup.ConnectionString))
{
var userId = Guid.Parse(new security.AesAlgoridhm().Decrypt(User.Claims.Where(x => x.Type == JwtRegisteredClaimNames.Sid)?.FirstOrDefault().Value));
ProfileResponse user = new ProfileResponse();
if (user == null)
context.Result = new CustomResultFilters("error_access_token_expired", 401);
if (!user.EmailConfirmed)
context.Result = new CustomResultFilters("bad_response_account_not_confirmed", 400);
if (!user.Active)
context.Result = new CustomResultFilters("bad_response_account_inactive", 400);
}
}
}
Я попытался передать локализатор в конструктор, как это, но когда я передаю аргумент от контроллера, он выдает мне ошибку как
параметр конструктора атрибута имеет тип, который не является допустимым типом параметра атрибута
IStringLocalizer<dynamic> localize { get; set; }
public CustomAuthorizeFilters(IStringLocalizer<dynamic> localizer = null)
{
localize = localizer;
}
Я знаю, что атрибут поддерживает только примитивные типы данных, поэтому я также попытался внедрить прямую зависимость как
context.HttpContext.RequestServices.GetService(typeof(IStringLocalizer<dynamic>));
но это дает ошибку, поскольку не может конвертировать из объекта в локализатор.
Любая помощь будет оценена.
Как следует из сообщения об ошибке, вы не можете передать dynamic
тип в качестве параметра атрибута. Как следует из этого ответа и согласно Microsoft, это допустимые типы параметров атрибута
IStringLocalizer<MyController>
будет искать файл ресурсов с именемMyController.xx-yy.resx
. Если вам нужен общий ресурс локализации, используйте фиксированный класс или фиктивный класс, такой какIStringLocalizer<SharedResources>
гдеSharedResources
- просто пустой класс.public class SharedResources { }
ServiceFilter