Я загрузил предварительную версию 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 будет работать из коробки, что меня больше всего сбивает с толку ...
SignInAsync
- person James Sampica   schedule 03.09.2014RedirectToAction()
к контроллеру и он не работает? - person Erik Philips   schedule 03.09.2014Usermanager
по умолчанию будет извлекать роли для пользователя и помещать их в файл cookie. Поместите точку останова наidentity = await Usermanager...
и посмотрите, содержит ли этот файл cookie ваши роли. - person James Sampica   schedule 03.09.2014