Атрибут Authorize всегда возвращает ложный идентификатор ASP.net MVC - PullRequest
0 голосов
/ 26 апреля 2019

Когда я украшаю метод с помощью атрибута Authorize role, он возвращает false каждый раз. Я пытаюсь ограничить доступ к странице администратора только для пользователей с ролью «Администратор».

  1. Я подтвердил, что пользователь в данный момент вошел в систему, как на самом деле в роли «Администратор».

  2. Я попытался использовать пользовательский атрибут авторизации. Тот же результат. Я могу добавить код, если это необходимо.

  3. Я обнаружил, что атрибут авторизации работает для пользователей, но не для ролей.

  4. Я считаю, что эта проблема как-то связана с тем, что в моем приложении не работает следующее:

    User.IsInRole("Admin"). 
    

    Однако это утверждение работает:

    userManager.IsInRole(user.Id, "Admin")
    

Вот мой код:

public class AdminController : Controller
    {

        //[AuthLog(Roles = "Admin")] //Custom authorization attribute
        [Authorize(Roles = "Admin")]
        public ActionResult Users()
        {

            return View();
        }


    }

Может быть, это поможет с отладкой:

  • Microsoft.AspNet.Identity.Core: V.2.1.0
  • Microsoft.AspNet.Identity.EntityFramework: V.2.1.0

Users Users assigned to roles User Id's assigned to roles

Я открыт для предложений обо всем, что я могу опубликовать в своем проекте, чтобы легче было отлаживать Я чистил стек уже 2 недели.

Обновление 1: Как пользователь вошел в систему

// POST: /account/login
    [HttpPost]
    [AllowAnonymous]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Login(AccountLoginModel viewModel)
    {
        // Ensure we have a valid viewModel to work with
        if (!ModelState.IsValid)
            return View(viewModel);

        // Verify if a user exists with the provided identity information
        var user = await _manager.FindByEmailAsync(viewModel.Email);

        // If a user was found
        if (user != null)
        {
            // Then create an identity for it and sign it in
            await SignInAsync(user, viewModel.RememberMe);

            // If the user came from a specific page, redirect back to it
            return RedirectToLocal(viewModel.ReturnUrl);
        }

        // No existing user was found that matched the given criteria
        ModelState.AddModelError("", "Invalid username or password.");

        // If we got this far, something failed, redisplay form
        return View(viewModel);
    }

    private async Task SignInAsync(IdentityUser user, bool isPersistent)
    {
        // Clear any lingering authencation data
        FormsAuthentication.SignOut();

        // Create a claims based identity for the current user
        var identity = await _manager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);

        // Write the authentication cookie
        FormsAuthentication.SetAuthCookie(identity.Name, isPersistent);
    }

1 Ответ

2 голосов
/ 26 апреля 2019

К сожалению,

FormsAuthentication.SetAuthCookie(identity.Name, isPersistent);

не хранит роли с идентичностью.Таким образом, когда личность воссоздается из cookie, у вас нет ролей.Для проверки попробуйте

this.User.IsInRole("Admin")

, и вы получите false, хотя userManager говорит об обратном.

Существует несколько обходных путей.

Вы можетенапример, переключитесь на любой другой персистентный идентификатор, например SessionAuthenticationModule, который может сохранить ваше имя пользователя и роли в файле cookie.Вы можете следовать моему учебнику .

Другой подход заключается в том, чтобы иметь явный менеджер ролей и использовать его функцию, которая автоматически заставляет ваши роли храниться в другом файле cookie, отдельно от форм.cookie для аутентификации.Это включает в себя настройку поставщика ролей и написание собственного поставщика ролей, который будет адаптером для менеджера пользователей.

Наконец, вы можете забыть аутентификацию форм и использовать собственный способ Identity для выдачи файлов cookie, который будет включать вызов SignInAsync в диспетчере аутентификации.

...