IdentityServer4 Как я могу перенаправить после входа на предыдущую страницу URL без регистрации всех маршрутов в IdP - PullRequest
0 голосов
/ 09 мая 2019

Как рекомендую, я бы зарегистрировал обратный вызов авторизации url / redirect_url в IdP, который работает.

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

redirect_url всегда настроен (точка входа на домашнюю страницу).

Чтобы изменить это поведение, мне нужно зарегистрировать все возможные маршруты в IdP.Это не может быть решением!

В методе входа в систему idsrv Я попытался:

Login(string returnUrl)

проверка значения из returnUrl дает /connect/authorize/callback?client_id=...

Разве returnUrl не должен иметь URL предыдущей страницы?Как и в обычном приложении mvc: ..

Я пытался заставить Referer сохранить его в сеансе, а затем перенаправить ..

 if (!string.IsNullOrEmpty(Request.Headers["Referer"].ToString()))
 {
      this.httpContextAccessor.HttpContext.Session.SetString("Referer", Request.Headers["Referer"].ToString());
 }

Но это не работает Referer имеет нулевое значение ...

Я проверил, что происходит в контексте от служб взаимодействия

var context = await _interaction.GetAuthorizationContextAsync(model.ReturnUrl);
                        context.RedirectUri

И возвращает /signin-oidc/ Это автоматический способ возврата (Точка входа на главную страницу).

Есть ли шанс получить предыдущий URL, чтобы можно было перенаправить пользователя?

Так что я могу сделать еще?

Я использую гибридный поток для управления следующими клиентами: mvc-приложение, classic-asp, веб-интерфейс

1 Ответ

1 голос
/ 10 мая 2019

Вот пример реализации, позволяющей вам достичь того, чего вы хотите. Имейте в виду, что есть и другие способы сделать это.

Весь код идет на вашем клиенте, сервер никогда ничего не знает о конечном URL.

Сначала вы хотите создать собственный атрибут, который будет украшать все ваши действия / контроллеры, которые вы хотите защитить:

using System;
using System.Web.Mvc;

namespace MyApp
{
    internal class MyCustomAuthorizeAttribute : AuthorizeAttribute
    {
        public override void OnAuthorization(AuthorizationContext filterContext)
        {
            base.OnAuthorization(filterContext);

            if (filterContext.Result is HttpUnauthorizedResult)
            {
              filterContext.RequestContext.HttpContext.Session["oidc-returnUrl"] = filterContext.RequestContext.HttpContext.Request.UrlReferrer?.PathAndQuery;
            }
        }
    }
}

И затем вы создадите маршрут / действие для входа в систему, которое будет обрабатывать все ваши запросы на авторизацию:

using System.Web.Mvc;

namespace MyApp
{
    public class AccountController : Controller
    {
        [MyCustomAuthorize]
        public ActionResult Login()
        {
            returnUrl = Session["oidc-returnUrl"]?.ToString();

            // clean up
            Session["oidc-returnUrl"] = null;

            return Redirect(returnUrl ?? "/");
        }
    }
}

Путь входа может быть изменен в вашем коде запуска:

public class Startup
{

    public void Configure(IApplicationBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            LoginPath = "/my-login"
        });

        app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
        {
            // setting up your client
        });
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...