Атрибут авторизации не работает

Я загрузил предварительную версию Microsoft.AspNet.Identity.Samples, которую можно найти по адресу: https://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples

Также я адаптировал образец с GitHub.

В обоих случаях всякий раз, когда я пытаюсь получить доступ к «RolesAdmin», то есть к ~ / Rolesadmin / page, он отбрасывает меня обратно на страницу входа.

Я подтвердил, что пользователь вошел в систему и принадлежит к роли администратора, так почему же атрибут Authorize не разрешает мне вход на страницу roleadmin?

namespace IdentitySample.Controllers
{
    [Authorize(Roles = "Admin")]
    public class RolesAdminController : Controller
...

Вот мой код для подтверждения (ViewBag.IsLoggedIn и ViewBag.IsAdmin возвращаются как истинные после входа в систему:

  if (User.Identity.IsAuthenticated)
            {
                MyDbContext context = new MyDbContext();

                var UserManager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(context));
                var RoleManager = new RoleManager<IdentityRole>(new RoleStore<IdentityRole>(context));

                var appUser = UserManager.FindByName("Admin");

                var userIsInRole = UserManager.IsInRole(appUser.Id, "Admin");
                ViewBag.IsLoggedIn = true;
                ViewBag.IsAdmin = userIsInRole;
            }
            else
            {
                ViewBag.IsLoggedIn = false;
                ViewBag.IsAdmin = false;
            }

Если есть хороший пример кода для ASP.NET Identity 2.1.0 - дайте мне знать.

Почему я не могу получить доступ к этому контроллеру?

Я просмотрел эту страницу: MVC 5 Asp.Net Identity Authorize Attribute error

И эта страница: Идентификация ASP.NET - путаница в отношении [авторизации] и RoleManager

И эта страница: Аутентификация пользовательских форм + MVC3 + AuthorizeAttribute

Кажется, ничего из этого не помогает.

Примечания: Я использую VS2012 с последним обновлением инструментов, SQL Server 2012 Express. Кроме того, в одном из примеров кода вы увидите, что я создал пользователя с именем Admin и роль с именем Admin - я просто скопировал код, который должен признать.

Соответствующий бит web.config, похоже, не имеет значения:

<membership>
      <providers>
        <clear />
      </providers>
    </membership>

    <roleManager enabled="true">
      <providers>
        <clear />
      </providers>
    </roleManager>

   <system.webServer>
        <modules runAllManagedModulesForAllRequests="true" >
      <remove name="RoleManager" />
    </modules>
  </system.webServer>



public class FilterConfig
    {
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new HandleErrorAttribute());
            filters.Add(new AuthorizeAttribute()); // Added this in a vein attempt
        }
    }

Стартовый класс

public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app)
        {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/Account/Login")
            });

            app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

Код входа в AccountController:

 [HttpPost]
        [AllowAnonymous]
        [ValidateAntiForgeryToken]
        public async Task<ActionResult> Login(LoginViewModel model, string returnUrl)
        {
            if (ModelState.IsValid)
            {
                var user = await UserManager.FindAsync(model.UserName, model.Password);
                if (user != null)
                {
                    await SignInAsync(user, model.RememberMe);
                    return RedirectToLocal(returnUrl);
                }
                else
                {
                    ModelState.AddModelError("", "Invalid username or password.");
                }
            }

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

Код SignInAsync:

private async Task SignInAsync(ApplicationUser user, bool isPersistent)
        {
            AuthenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
            var identity = await UserManager.CreateIdentityAsync(user, DefaultAuthenticationTypes.ApplicationCookie);
            // Add more custom claims here if you want. Eg HomeTown can be a claim for the User
            //var homeclaim = new Claim(ClaimTypes.Country, user.HomeTown);
            //identity.AddClaim(homeclaim);
            AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = isPersistent }, identity);
        }

Я ожидал, что образец Microsoft будет работать из коробки, что меня больше всего сбивает с толку ...


person DanAbdn    schedule 02.09.2014    source источник
comment
Где код, в котором вы регистрируете пользователя?   -  person James Sampica    schedule 03.09.2014
comment
Ответ обновлен кодом   -  person DanAbdn    schedule 03.09.2014
comment
Где код для SignInAsync   -  person James Sampica    schedule 03.09.2014
comment
Добавлено - это как-то связано с утверждениями, которые как-то связаны с ролями?   -  person DanAbdn    schedule 03.09.2014
comment
Я только что добавил identity.AddClaim (новое утверждение (ClaimTypes.Role, Admin)); и теперь это работает!   -  person DanAbdn    schedule 03.09.2014
comment
После того, как пользователь вошел в систему, вы RedirectToAction() к контроллеру и он не работает?   -  person Erik Philips    schedule 03.09.2014
comment
Да, когда личность сгенерирована, реализация Usermanager по умолчанию будет извлекать роли для пользователя и помещать их в файл cookie. Поместите точку останова на identity = await Usermanager... и посмотрите, содержит ли этот файл cookie ваши роли.   -  person James Sampica    schedule 03.09.2014
comment
Он вошел в систему, перешел на домашнюю страницу, затем, если я попытался перейти к авторизованному защищенному контроллеру / действию по имени роли, он перенаправился на страницу входа.   -  person DanAbdn    schedule 03.09.2014


Ответы (1)


Отвечать:

1) Используйте https://www.nuget.org/packages/Microsoft.AspNet.Identity.Samples -Pre

Не регистрируйтесь на своем веб-сайте, а затем ожидайте получить доступ к своему контроллеру, защищенному атрибутом Authorize с ролями, установленными на Admin. Вашему новому пользователю не будет назначена роль администратора. Используйте логин по умолчанию: [email protected] с паролем Admin @ 123456.

2) Я нашел этот образец github (https://github.com/rustd/AspnetIdentitySample/tree/master/AspnetIdentitySample), связанная с веб-сайтом asp.net, либо не работает (потому что не создавалась без ручного добавления слова «класс» к наследованию класса), либо просто устарела.

3) Будьте осторожны с конфигурациями web.config и sub-web.config при копировании из образца.

4) Возможно, вы захотите не интегрировать часть моего кода, приведенного выше, поскольку его нет в образце (тот, который работает).

Теперь я могу продолжить, беспрепятственно, создавать свой веб-сайт регистрации сигналов, отчетности и визуализации на основе сенсора arduino yun для моих проектов дома / пивоварения / садоводства.

person DanAbdn    schedule 02.09.2014
comment
UserManager.CreateIdentityAsync это должно позаботиться о ролях. Тот факт, что это не так, означает, что проблема с вашим UserManager - person James Sampica; 03.09.2014
comment
Спасибо за помощь @Shoe - вы, наверное, правы, я еще раз изучу образец и пока засовываю хвост между ног. - person DanAbdn; 03.09.2014