У меня есть приложение MVC ядра Asp .net. Который подключается к Identity Server 4 для аутентификации. Размещено в рое докеров
Приложение MVC размещено на https: // XXXXXXX
ConfigurServies
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
//options.DataProtectionProvider = DataProtectionProvider.Create(new DirectoryInfo(@"C:\temp-keys\"));
// when the identity has been created from the data we receive,
// persist it with this authentication scheme, hence in a cookie
options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
// Identity server endpoint
options.Authority = settingsSetup.IdentityServerEndpoint;
// Client id to login with
options.ClientId = settingsSetup.ClientId;
// Client secret.
options.ClientSecret = settingsSetup.Secret;
// Scope of our API
options.Scope.Add("testapi");
options.Scope.Add("devconsole");
// adding offline_access to get a refresh token
options.Scope.Add("offline_access");
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
});
Когда я пытаюсь запустить приложение, я получаю сообщение об ошибке совпадения uri при перенаправлении.
Invalid redirect_uri: http://developerconsole.XXXXX.io/signin-oidc
{
"ClientId": "BB1D2DA8-D7E4-4AF5-94FA-19EAD6B7D711.apps.XXXXX.biz",
"ClientName": "Developer Console",
"AllowedRedirectUris": [
"http://localhost:55000/signin-oidc",
"http://localhost:55000/auth.html",
"http://localhost:55000/auth-silent.html"
"https://developerconsole.XXXXX.io/signin-oidc"
],
"SubjectId": "21379983",
"RequestedScopes": "",
"Raw": {
"client_id": "BB1D2DA8-D7E4-4AF5-94FA-19EAD6B7D711.apps.XXXXX.biz",
"redirect_uri": "http://developerconsole.XXXXX.io/signin-oidc",
"response_type": "code id_token",
"scope": "openid profile testapi devconsole offline_access",
"response_mode": "form_post",
"nonce": "636625889658410682.MjNlMmQwNjgtZmY0MC00MmVkLWFiNmMtN2M2YmQ5YTM5ZTQ3NjFiYzI2ZjktZWM0Yi00NDk3LTk1ZWMtNjJkYjViMDYwMTJm",
"state": "CfDJ8Pwa8A3ipXlKtuyxNMpMxAz5QUFmdSunRKdlKS9sS390AKp8gIUZShQUMMCkFAhYLytitgsXUBgwlQDJaJvtHFqzHygLCPwS8Jab6IJzhpry90qS51E1y_eRlppamRDOzYDZ6fcDFzWV1U43BTP2B6pnPTSLNcZRaooyGBXtNokeUqOJ--u-_MOQB8Bw3n2cRyV4kisHNkslD1Gsi2wn1Cx6aTVlqzw_pxHelAXm1P8FyDJpD7G0azFgKgpQF0DRJtC5penRJQzHIHvQN8v4ECGeuSD1zlyfJYClLO2r6kY_R2OYqtBkV0r_SNc9h7xUYmnVaHKQzYqVc_mJO4iLLSMTZrBUICZWR8c4PZw0Os3N",
"x-client-SKU": "ID_NET",
"x-client-ver": "2.1.4.0"
}
}
Ошибка возникает из-за того, что у меня есть "https://developerconsole.XXXXX.io/signin-oidc"
в качестве URI перенаправления, а не "http://developerconsole.XXXXX.io/signin-oidc"
. Я не хочу добавлять URI перенаправления HTTP.
Почему мое приложение создает URI перенаправления с http, а не https?
Если я добавлю HTTP, я получаю раздражающую ошибку корреляции. что, я думаю, связано с тем, что он возвращается сервером как https, поскольку сервер автоматически преобразует http в https.
An unhandled exception occurred while processing the request. Exception: Correlation failed. Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler+d__12.MoveNext()
Stack Query Cookies Headers Exception: Correlation failed. Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler+d__12.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) Microsoft.AspNetCore.Authentication.AuthenticationMiddleware+d__6.MoveNext() System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware+d__7.MoveNext()
Мне, вероятно, не нужно упоминать, что это отлично работает на localhost: /
Что ж, я знаю, что у нас есть балансировщик нагрузки, и я знаю, кого искать.
... в этом случае может помочь ПО промежуточного слоя перенаправленных заголовков в Microsoft.AspNetCore.HttpOverrides
. Взгляните сюда: docs.microsoft.com/en-us/aspnet/core/host-and-deploy/…
Только в случае необходимости обратитесь к администратору балансировщика нагрузки, чтобы убедиться, что заголовки X-Forwarded-For
, X-Forwarded-Proto
и X-Forwarded-Host
включены в перенаправленные запросы. Вероятно, так и есть.
Мне только что сказали (l4) тот, что в рое докеров. Это работает в другом проекте @spender, которому интересно, добавил ли он его в этот проект, а не в этот.
Если это балансировка нагрузки на уровне 4, то вышеуказанное не применимо.
Можете ли вы дважды проверить правильность settingsSetup.IdentityServerEndpoint
?
@penleychan, если бы это было неправильно, я бы не получил правильный ответ от сервера идентификации. Сервер регистрирует меня в своем приложении, которое не влияет на логин правильно
Решение было довольно простым. Установив UseForwardedHeaders, он теперь отправляет все запросы как HTTPS.
app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedProto
});
Correlation failed.
теперь исправлено, и мне больше не нужно использовать uris для перенаправления http и https.
В случае, если приложение развертывается в Linux (скажем, приложение .NET core в контейнере докеров Linux), помимо настройки заголовков Forward также необходимо было очистить KnownNetworks
и KnownProxies
, чтобы убедиться, что URL-адрес перенаправления оставался https. Подробнее см. docs.microsoft.com/en-us/aspnet/core/host-and-deploy/….
@SuketuBhuta Эта информация была действительно полезной
Нам пришлось использовать это решение, потому что мы перенаправили HTTP на HTTPS в NGINX conf за aws ELB. и это сработало для нас как шарм.
@SuketuBhuta, как / где / когда вы очистили KnownNetworks
и KnownProxies
?
@David, см. Этот раздел статьи, на которую я ссылался выше: docs.microsoft.com/en-us/aspnet/core/host-and-deploy/…, в основном вы очищаете после установки ForwardingHeader
. Надеюсь это поможет.
добавьте этот код только в свой файл web.config и, конечно же, на change.com со своим веб-сайтом, любой вводит URL-адрес в браузере напрямую URI перенаправления с HTTP на HTTPS.
<system.webServer>
<rewrite>
<rules>
<rule name = "IP Hit" stopProcessing = "true">
<match url = "(.*)" />
<conditions>
<add input = "{HTTP_HOST}" pattern = "http://www.exemple.com" />
<add input = "{HTTPS}" pattern = "off" ignoreCase = "true" />
</conditions>
<action type = "Redirect" url = "https://www.exemple.com/{R:1}" redirectType = "Permanent" />
</rule>
</rules>
</rewrite>
<urlCompression doDynamicCompression = "true" doStaticCompression = "true" dynamicCompressionBeforeCache = "true" />
<staticContent>
<clientCache cacheControlMode = "UseMaxAge" cacheControlMaxAge = "365:00:00" />
</staticContent>
<system.webServer>
Этот ответ только перемещает пункт назначения с http на https, он не заставляет ссылки отображаться в https.
Может ли это быть из-за того, что вы находитесь за балансировщиком нагрузки (L7), а внутренняя связь за балансировщиком происходит по протоколу HTTP, а не HTTPS?