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], он не перенаправляется на страницу входа.

Что я делаю неправильно?

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

Заранее спасибо за любые указатели!

0 ответов

Другие вопросы по тегам