Я интегрирую Identity Server 4
в свое старое ASP.NET MVC
решение. Я могу сказать, что логин работает нормально и рад за это. У меня только две небольшие проблемы:
- когда пользователь нажимает Отмена на странице Логин
- a Логин ссылка
когда пользователь нажимает Отмена на странице входа в систему
В моем приложении есть ссылки на страницы Authorize
. В этом случае я ожидаю, что пользователь сможет видеть эти страницы, только если он авторизован. Как я и ожидал, пользователь перенаправляется на страницу Identity Server Login . Если учетные данные действительны, на сайте отображаются защищенные страницы. Работа выполнена!
Проблема у меня возникает, когда пользователь вместо логина нажимает Отмена на странице входа. В этом случае пользователь не авторизуется и Identity Server
возвращает access_denied
. Но, как на этом скриншоте, есть ошибка от Microsoft.Owin.Security.OpenIdConnect
.
Я попытался добавить в 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.