Пользовательский IsInRole () при использовании ПО промежуточного слоя для файлов cookie без удостоверения ASP.NET

Для обеспечения совместимости с существующими приложениями я планировал использовать 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();
    }
}
  1. Могу ли я использовать атрибут [Authorize(Roles = "ADMIN")], если не используется Identity и используется только Middleware?

  2. Как? :-)

Если бы мне пришлось угадывать, я неправильно реализую p.IsInRole() - в настоящее время этот метод загружает роли, а затем возвращает True / False. Возможно, мне придется «загрузить» свои роли в другом месте таким образом, чтобы ClaimsPrincipal.IsInRole было достаточно. Если бы я использовал Identity (), я предполагаю, что это была бы реализация IUserRoleStore.

Другой мой ответ «если бы я должен был угадать» заключается в том, что где-то в файле startup.cs мне нужно заменить текущий ClaimsPrincipal экземпляром MyClaimsPrincipal.

Спасибо!


person Robert Paulsen    schedule 03.05.2016    source источник


Ответы (1)


Вы должны добавить утверждения о ролях при создании файла cookie.

В startup.cs:

app.UseCookieAuthentication(options =>
{
     options.AuthenticationScheme = "MyCookieMiddlewareInstance";
     options.LoginPath = new PathString("/Account/Login/");
     options.AccessDeniedPath = new PathString("/Account/Forbidden/");
     options.AutomaticAuthenticate = true;
     options.AutomaticChallenge = true;
 });

И метод публикации входа в систему может быть примерно таким (я предполагаю, что у вас есть настраиваемая страница входа):

[HttpPost]
public IActionResult Login(string userName, string password, string returnUrl)
{
     var user = _userService.GetUser(userName, password);// i assume that  _userService is injected
     if (user == null)
     {
          //return Error;
     }
     var claims = new List<Claim>()
     {
          new Claim(ClaimTypes.NameIdentifier, user.Id),
          new Claim(ClaimTypes.Name, user.GetFullName() ),
     };
     var identity = new ClaimsIdentity(claims, "Forms");
     identity.AddClaim(new Claim(ClaimTypes.Role, "ADMIN"));
     var principal = new ClaimsPrincipal(identity);

     HttpContext.Authentication.SignInAsync("MyCookieMiddlewareInstance", principal);
     return Redirect(returnUrl);
}
person adem caglin    schedule 03.05.2016