Перенаправить на несколько страниц во время аутентификации ASP.CORE - PullRequest
0 голосов
/ 19 декабря 2018

В моем приложении ASP.CORE я использую аутентификацию по идентификатору пользователя.

Я хочу сделать следующее: когда пользователь посещает сайт, если он не авторизован на сайте - показать ему домашнюю страницу, но если он был авторизован ранее- показать ему другую страницу (страница шифрования контроллера в моем примере). НО ЕСЛИ он перейдет с домашней страницы на / Encrypt, программа должна перенаправить его на страницу входа (как это работает сейчас).

Здесь, при запуске в Configure, я попытался перенаправить на другую страницу /Зашифровать (по умолчанию), когда пользователь посещает сайт, если пользователь был авторизован ранее - все работает (он перенаправляет на страницу / Зашифровать), НО, если он не был авторизован ранее, программа перенаправит его на страницу входа на контроллере аккаунта. Вот в чем проблема.

Я отмечаю, что Account Controller не запускается, если пользователь был авторизован ранее (только если ранее не авторизовался (без файлов cookie аутентификации)), поэтому яневозможно перенаправить с помощью Account Contoller. Итак, где находится запрос на перехват (или читается об этом) или где выполняется проверка файлов cookie для авторизации?Или что с этим делать?

Моя настройка запуска:

public void ConfigureServices(IServiceCollection services)
    {
       services.AddIdentity<User, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationContext>();
    ...

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
        app.UseAuthentication();
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Encrypt}/{action=Index}");
        });
    }

Мой контроллер учетной записи выглядит так:

public class AccountController : Controller
{
    private readonly UserManager<User> _userManager;
    private readonly SignInManager<User> _signInManager;

    public AccountController(UserManager<User> userManager, SignInManager<User> signInManager)
    {
        _userManager = userManager;
        _signInManager = signInManager;
    }
    [HttpGet]
    public IActionResult Login(string returnUrl = null)
    {
        ViewData["UserName"] = this.GetUserName();
        return View(new LoginViewModel { ReturnUrl = returnUrl });
    }

    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<IActionResult> Login(LoginViewModel model)
    {
        if (ModelState.IsValid)
        {
            var result =
                await _signInManager.PasswordSignInAsync(model.Email, model.Password, model.RememberMe, false);
            if (result.Succeeded)
            {
                if (!string.IsNullOrEmpty(model.ReturnUrl) && Url.IsLocalUrl(model.ReturnUrl))
                {
                    return Redirect(model.ReturnUrl);
                }
                else
                {
                    return RedirectToAction("Index", "Home");
                }
 return View(model);
}

Мой контроллер шифрования выглядит следующим образом:

[Authorize]
public class EncryptController : Controller
{ ... }

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

Я нашел частичное решение.

Сделайте так:

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        ...
        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "default",
                template: "{controller=Home}/{action=Index}");
        });
    }

И Home Controller вот так:

public IActionResult Index()
        {
            if (User.Identity.IsAuthenticated & !HttpContext.Session.Keys.Contains("Key"))
            {
                HttpContext.Session.SetInt32("Key", 1);
                return RedirectToAction("Index", "Encrypt");
            }
            else 
                return View();
        }

Но это работает только1 раз во время сеанса, поэтому, чтобы начать работу во второй раз, нужно начать сеанс снова, закрыв браузер.

Так что все еще не хорошо.

Если я буду всегдапросто перенаправьте с домашней страницы, если авторизован - он никогда не увидит домашнюю страницу.Слишком не хорошо.

0 голосов
/ 19 декабря 2018

Добавьте этот код к вашему запуску для обработки запросов на доступ:

 services.ConfigureApplicationCookie(options =>
            {
                options.AccessDeniedPath = "/Account/Access-Denied";
                options.LoginPath = "/Account/Login";
                options.LogoutPath = "/Account/Signout";
                options.SlidingExpiration = true;
            });

В частности, .AccessDeniedPath должен облегчить вашу проблему, добавив его в представление Encrypt ...

...