Реализация выхода из Azure B2C в приложениях ASP.NET Core MVC и ASP.NET MVC.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Реализация выхода из Azure B2C в приложениях ASP.NET Core MVC и ASP.NET MVC.

Сообщение Anonymous »

В настоящее время я работаю над несколькими приложениями, использующими разные платформы: два приложения ASP.NET MVC на устаревшей платформе .NET и одно приложение ASP.NET Core MVC. Все эти приложения используют Azure AD B2C для аутентификации. Оба приложения .NET Framework реализуют Azure AD B2C с использованием промежуточного программного обеспечения OpenID Connect и успешно используют единый вход (SSO).
Однако я изо всех сил пытаюсь реализовать согласованный подход. возможность выхода из этих приложений.
Особые проблемы:
  • Проблема единого выхода:
    Функция выхода из системы в моем приложении ASP.NET Core работает правильно, если использовать ее самостоятельно. Однако выход из приложения ASP.NET Core не приводит к выходу пользователя из приложений .NET Framework, что нарушает согласованность единого выхода из системы. Эта проблема сохраняется, несмотря на то, что все приложения используют один и тот же клиент и политику Azure AD B2C.
  • Реализация выхода из системы .NET Framework:

    В моих приложениях ASP.NET MVC я использую Request.GetOwinContext().Authentication.SignOut(), чтобы выйти из системы пользователя и перенаправить его на URL-адрес выхода из Azure AD B2C. Хотя URL-адрес правильный и перенаправление происходит должным образом, выход пользователя из приложения ASP.NET Core не удается.
Что я пробовал:
  • Убедился, что URL-адрес выхода из системы, используемый в приложениях, настроен правильно.
  • Дважды проверил реализацию логики выхода, но система единого входа остается непоследовательной

    < li>Реализован выход из переднего канала, как рекомендовано в документации Microsoft, но это не решило проблему
Код приложения ASP.NET Core MVC:
builder.Services.AddMicrosoftIdentityWebAppAuthentication(builder.Configuration,Microsoft.Identity.Web.Constants.AzureAdB2C);
builder.Services.Configure(options =>
{
options.SlidingExpiration = true;
options.ExpireTimeSpan = TimeSpan.FromMinutes(5);
});

builder.Services.Configure(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.SignedOutCallbackPath = new PathString("/signout-callback-oidc");
options.Events.OnRedirectToIdentityProviderForSignOut = context =>
{
var id_token_hint = context.Properties.Items.FirstOrDefault(x => x.Key == "id_token_hint").Value;
if (id_token_hint != null)
{
context.ProtocolMessage.SetParameter("id_token_hint", id_token_hint);
}
return Task.CompletedTask;
};
options.Events.OnAuthenticationFailed = context =>
{
context.HandleResponse();
context.Response.Redirect("/Error/ErrorMessage?message=" + context.Exception.Message);
return Task.CompletedTask;
};
});

Приложение ASP.NET MVC:
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);

var env = (baseEnv.ToLower() == "live") ? "" : baseEnv;
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies",
CookieSecure = CookieSecureOption.Always,
CookieHttpOnly = true,
CookiePath = "/",
ExpireTimeSpan = new TimeSpan(28,0,0,0,0),
SlidingExpiration = true
});

var baseUrlCleansed = $"{baseUrl.TrimEnd('/')}";
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
MetadataAddress = "https://" + tenantName + ".b2clogin.com/" + tenantName + ".onmicrosoft.com/" + signinFlow + "/v2.0/.well-known/openid-configuration",
ClientId = clientId,
RedirectUri = $"{baseUrlCleansed}/",
ResponseType = "id_token",
PostLogoutRedirectUri = $"{baseUrlCleansed}/",
Scope = "openid",
SignInAsAuthenticationType = "Cookies",
UseTokenLifetime = false,

Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async n =>
{
var id = n.AuthenticationTicket.Identity;

id.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));

var claimsProcessor = new ClaimsProcessor();
await claimsProcessor.ProcessClaims(id);

},
RedirectToIdentityProvider = n =>
{
if (n.ProtocolMessage.RequestType == OpenIdConnectRequestType.LogoutRequest)
{
var idTokenHint = n.OwinContext.Authentication.User.FindFirst("id_token");
if (idTokenHint != null)
{
n.ProtocolMessage.IdTokenHint = idTokenHint.Value;
}
}
return Task.FromResult(0);
},
AuthenticationFailed = n =>
{
var exception = n.Exception;
if (exception is OpenIdConnectProtocolInvalidNonceException && exception.Message.Contains("IDX10316"))
{
n.HandleResponse();
n.Response.Redirect("/");
}
if (exception.Message.StartsWith("OICE_20004") || exception.Message.Contains("IDX10311"))
{
n.SkipToNextMiddleware();
n.Response.Redirect("/");
}
return Task.FromResult(null);
},
MessageReceived = n =>
{
return Task.FromResult(null);
}
}
});


Подробнее здесь: https://stackoverflow.com/questions/791 ... plications
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»