ASP.NET MVC 5 с IdentityServer4: URL-адрес входа и доступ запрещен - PullRequest
0 голосов
/ 08 января 2019

Я интегрирую Identity Server 4 в свое старое ASP.NET MVC решение. Я могу сказать, что логин работает нормально и рад за это. У меня только две небольшие проблемы:

  1. когда пользователь нажимает Отмена на странице Логин
  2. a Логин ссылка

когда пользователь нажимает Отмена на странице входа в систему

В моем приложении есть ссылки на страницы Authorize. В этом случае я ожидаю, что пользователь сможет видеть эти страницы, только если он авторизован. Как я и ожидал, пользователь перенаправляется на страницу Identity Server Login . Если учетные данные действительны, на сайте отображаются защищенные страницы. Работа выполнена!

IdentityServer4 Login

Проблема у меня возникает, когда пользователь вместо логина нажимает Отмена на странице входа. В этом случае пользователь не авторизуется и Identity Server возвращает access_denied. Но, как на этом скриншоте, есть ошибка от Microsoft.Owin.Security.OpenIdConnect.

Error when the user cancels an operation

Я попытался добавить в Startup для Owin OnAuthenticationFailed, но ничего не изменилось.

using Microsoft.IdentityModel.Protocols;
using Microsoft.Owin;
using Microsoft.Owin.Security.Cookies;
using Microsoft.Owin.Security.Notifications;
using Microsoft.Owin.Security.OpenIdConnect;
using Owin;
using System.Threading.Tasks;

[assembly: OwinStartup(typeof(PSC.Startup))]
namespace PSC {
    public partial class Startup
    {
        public void ConfigureAuth(IAppBuilder app) {
            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationType = "Cookies",
            });

            app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
            {
                Authority = "http://auth.myurl.com, //ID Server
                ClientId = "ui",
                ClientSecret = "49C1A7E1-0C79-4A89-A3D6-A37998FB1975",
                ResponseType = "id_token code",
                SignInAsAuthenticationType = "Cookies",
                RedirectUri = "http://localhost:44889/signin-oidc",
                Scope = "openid",
                RequireHttpsMetadata = false,
            });
        }
        private Task OnAuthenticationFailed(
                     AuthenticationFailedNotification<OpenIdConnectMessage, 
                     OpenIdConnectAuthenticationOptions> context)
        {
            context.HandleResponse();

            if (context.ProtocolMessage.ErrorDescription != null && 
                context.ProtocolMessage.ErrorDescription.Contains("AADB2C90118"))
            {
                context.Response.Redirect("/Account/ResetPassword");
            }
            else if(context.ProtocolMessage.Error == "access_denied" && 
                    context.ProtocolMessage.ErrorDescription.StartsWith("AADB2C90091"))
            {
                context.Response.Redirect("/Home/Index");
            }
            else if(context.Exception.Message == "access_denied")
            {
                context.Response.Redirect("/");
            }
            else
            {
                context.Response.Redirect("/Home/Error?message=" + 
                                          context.Exception.Message);
            }
            return Task.FromResult(0);
        }
    }
}

Как мне справиться с этой проблемой?

Ссылка для входа

Обычно в _LoginPartial.cshtml есть ссылка на локальный сайт для входа, например

@Html.ActionLink("Log in", "Login", "Account", new { 
                 returnUrl = HttpContext.Current.Request.RawUrl }, 
                 htmlAttributes: new { id = "loginLink" })

Как мне получить правильную ссылку на страницу входа с IdentityServer? Я заметил, что ссылка на IdentityServer довольно сложная, с более подробной информацией, чем обратный URL.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...