Мне нужно автоматически перенаправить моего пользователя на idp, если это указано клиентом. По сути, я проверяю в методе Login моего AuthenticationController, что, если установлен IDP, я перенаправляю на другой метод на этом контроллере, который затем вызывает Challenge для IDP, это выглядит немного грязно, так как я действительно хотел бы создать еще один контроллер для обработки Внешняя аутентификация и не нужно путать локальный логин с проверкой / перенаправлением IDP.
Хотя я и подумал, есть ли способ для Identity Server 4 автоматически перенаправить вас, если вы установите idp? Я установил для EnableLocalLogin значение false для клиента и указал idp на клиенте (это добавляет ACR, как и ожидалось). Любая помощь будет очень признательна.
Запуск сервера .cs:
services.AddAuthentication()
.AddMicrosoftAccount("Microsoft", options =>
{
options.ClientId = this.Configuration["Credentials:AzureADClientID"];
options.SignInScheme = "Identity.External";
options.ClientSecret = this.Configuration["Credentials:AzureADClientSecret"];
options.AuthorizationEndpoint = this.Configuration["IdentityServer:AzureADAuthorisationEndpoint"];
options.TokenEndpoint = this.Configuration["IdentityServer:AzureADTokenEndpoint"];
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Cookie.Name = defaultSecurityPolicy.AuthenticationCookieName;
options.Cookie.Expiration = TimeSpan.FromMinutes(defaultSecurityPolicy.CookieValidForMinutes);
options.LoginPath = "/LogIn";
options.SlidingExpiration = true;
options.AccessDeniedPath = "/error/403";
options.ReturnUrlParameter = CookieAuthenticationDefaults.ReturnUrlParameter;
});
Server AuthenticationController.cs
[HttpGet("login")]
public async Task<IActionResult> Login(string username, string returnUrl)
{
await this.HttpContext.SignOutAsync(IdentityConstants.ExternalScheme);
var context = await this.interactionService.GetAuthorizationContextAsync(returnUrl);
if (context?.IdP != null)
{
var url = returnUrl;
var redirectUrl = this.Url.Action(nameof(this.ExternalLoginCallback), new { returnUrl = url });
var properties = this.signInManager.ConfigureExternalAuthenticationProperties("Microsoft", redirectUrl);
return this.Challenge(properties, "Microsoft");
}
var vm = new LoginViewModel { Username = username, ReturnUrl = returnUrl };
return this.View(vm);
}
Client Startup.cs
services.AddAuthentication(options =>
{
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddCookie(o =>
{
o.Cookie.Name = "CookieName";
o.Cookie.SecurePolicy = Microsoft.AspNetCore.Http.CookieSecurePolicy.Always;
o.Cookie.HttpOnly = true;
o.AccessDeniedPath = "/error/403";
o.Events.OnRedirectToAccessDenied = x =>
{
x.HttpContext.Response.StatusCode = 403;
return Task.CompletedTask;
};
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, o =>
{
o.Authority = this.Configuration.GetSection("IdentityServer").GetValue<string>("Url");
o.AuthenticationMethod = OpenIdConnectRedirectBehavior.RedirectGet;
o.ClientId = this.Configuration.GetSection("IdentityServer").GetValue<string>("ClientId");
o.ClientSecret = this.Configuration.GetSection("IdentityServer").GetValue<string>("ClientSecret");
o.RequireHttpsMetadata = true;
o.SaveTokens = true;
o.ResponseType = "code id_token";
o.GetClaimsFromUserInfoEndpoint = true;
o.Scope.Add("openid profile");
o.Events.OnRedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.Authentication)
{
n.ProtocolMessage.AcrValues = "idp:Microsoft";
}
return Task.FromResult(0);
};
});