asp.NET Core - атрибут Authorize не принудительно перенаправляет
Я настроил новый веб-проект asp.NET Core. Я хочу иметь собственную аутентификацию, где я создаю свой собственный файл cookie и назначаю претензии пользователю. Это было довольно просто настроить.
Мой код Startup.cs выглядит так:
public class Startup
{
public Startup(IHostingEnvironment env)
{
var builder = new ConfigurationBuilder()
.SetBasePath(env.ContentRootPath)
.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true)
.AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
.AddEnvironmentVariables();
Configuration = builder.Build();
}
public IConfigurationRoot Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
// Add framework services.
services.AddMvc();
services.Configure<CookieAuthenticationOptions>(options =>
{
options.LoginPath = new PathString("/account/login");
options.AccessDeniedPath = new PathString("/account/accessdenied");
options.AutomaticChallenge = true;
});
services.AddAuthorization(options =>
{
options.AddPolicy("AdminOnly", policy => {
policy.RequireClaim(ClaimTypes.Role, "admin"); });
});
}
public void Configure(IApplicationBuilder app,
IHostingEnvironment env, ILoggerFactory loggerFactory)
{
loggerFactory.AddConsole(Configuration.GetSection("Logging"));
loggerFactory.AddDebug();
app.UseStaticFiles();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
LoginPath = new PathString("/account/login"),
AccessDeniedPath = new PathString("/account/accessdenied"),
AutomaticChallenge = true
});
app.UseMvcWithDefaultRoute();
}
}
Затем я установил следующий метод входа в систему:
[HttpPost]
public async Task<IActionResult> Login(string userName,
string password, string returnUrl = null)
{
ViewData["ReturnUrl"] = returnUrl;
if (!string.IsNullOrEmpty(userName) && userName == password)
{
List<Claim> claims;
switch (userName)
{
case "admin":
claims = new List<Claim>
{
new Claim("sub", "2"),
new Claim("name", "Bob"),
new Claim("email", "bob@smith.com"),
new Claim("status", "junior"),
new Claim("department", "sales"),
new Claim("region", "north"),
new Claim("role", "supervisor"),
new Claim(ClaimTypes.Role, "admin")
};
break;
default:
claims = new List<Claim>
{
new Claim("sub", "3"),
new Claim("name", userName),
new Claim("email", userName + "@smith.com"),
new Claim("status", "intern"),
new Claim("department", "development"),
new Claim(ClaimTypes.Role, "client")
};
break;
}
var id = new ClaimsIdentity(claims, "local");//, "local", "name", "role"
await HttpContext.Authentication.SignInAsync("Cookies",
new ClaimsPrincipal(id));
return LocalRedirect("/Home/Index");
}
return View();
}
Все работает нормально, и добавление атрибута [Authorize] в любой из методов контроллера останавливает доступ, если вы не вошли в систему, например:
[Authorize]
public IActionResult AccessibleToLoggedIn()
{
ViewData["Message"] = "Example - open to any logged in user!";
return View();
}
[Authorize(Policy ="AdminOnly")]
public IActionResult AdminPage()
{
ViewData["Message"] = "Admin only page";
return View();
}
Пока все звучит хорошо...
Одна вещь, которую я пытаюсь заставить работать - когда пользователь пытается получить доступ к представлению с прикрепленным атрибутом [Authorize], он не перенаправляется на страницу входа.
Что я делаю неправильно?
Я также хотел бы иметь возможность перенаправить пользователя на страницу запрещенного доступа позже, когда они не соответствуют определенной политике, которую я намерен определить.
Заранее спасибо за любые указатели!