Для обеспечения совместимости с существующими приложениями я планировал использовать Middleware для файлов cookie без идентификатора ASP.NET, как описано в документации:
https://docs.asp.net/en/latest/security/authentication/cookie.html
Кажется, что это работает должным образом при входе пользователя в систему, но у меня проблемы с ролями, особенно при использовании [Authorize(Roles = "ADMIN")]
.
В приведенном ниже коде я могу вызвать p.IsInRole("ADMIN")
, и моя реализация MyClaimsPrincipal.IsInRole()
вызывается и возвращает true.
Что не работает, так это атрибут [Authorize(Roles = "ADMIN")]
, потому что он вызывает ClaimsPrincipal.IsInRole
(который возвращает False) вместо MyClaimsPrincipal.IsInRole()
(который возвращает True).
[Authorize(Roles = "ADMIN")]
public class MyAdminController : Controller
{
public IActionResult Index()
{
var p = new MyClaimsPrincipal(ClaimsPrincipal.Current);
bool isAdmin = p.IsInRole("ADMIN");
return View();
}
}
Могу ли я использовать атрибут
[Authorize(Roles = "ADMIN")]
, если не используется Identity и используется только Middleware?Как? :-)
Если бы мне пришлось угадывать, я неправильно реализую p.IsInRole()
- в настоящее время этот метод загружает роли, а затем возвращает True / False. Возможно, мне придется «загрузить» свои роли в другом месте таким образом, чтобы ClaimsPrincipal.IsInRole
было достаточно. Если бы я использовал Identity (), я предполагаю, что это была бы реализация IUserRoleStore
.
Другой мой ответ «если бы я должен был угадать» заключается в том, что где-то в файле startup.cs мне нужно заменить текущий ClaimsPrincipal
экземпляром MyClaimsPrincipal
.
Спасибо!