#.net #asp.net-mvc #azure #azure-active-directory #azure-webapps
Вопрос:
У меня есть 2 Dot net mvc5
заявки. Интерфейс и приложение API, размещенные в Azure
качестве веб — приложений. Интерфейсное приложение имеет Azure AD
настройку аутентификации в коде. Вот код ниже из startup.auth.cs
файла
var authority = string.Format("https://login.microsoftonline.com/{0}/v2.0", ConfigurationManager.AppSettings["TenantID"]);
var idClient = ConfidentialClientApplicationBuilder.Create(appId)
.WithRedirectUri(redirectUri)
.WithClientSecret(appSecret)
.WithAuthority(authority)
.Build();
var signedInUser = new ClaimsPrincipal(notification.AuthenticationTicket.Identity);
var tokenStore = new SessionTokenStore(idClient.UserTokenCache, HttpContext.Current, signedInUser);
try
{
string[] scopes = graphScopes.Split(' ');
var result = await idClient.AcquireTokenByAuthorizationCode(
scopes, notification.Code).ExecuteAsync();
var userDetails = await GraphHelper.GetUserDetailsAsync(result.AccessToken);
var cachedUser = new CachedUser()
{
DisplayName = userDetails.DisplayName,
Email = string.IsNullOrEmpty(userDetails.Mail) ?
userDetails.UserPrincipalName : userDetails.Mail,
Avatar = string.Empty,
AccessToken=result.AccessToken
};
MethodHelper methodHelper = new MethodHelper();
Dictionary<string, dynamic> authOutput = new Dictionary<string, dynamic>();
authOutput =await methodHelper.AuthorizeUserByEmailID(cachedUser.Email);
if (authOutput["Success"])
{
AuthenticatedUser authenticatedUserDetails = authOutput["AuthenticatedUser"];
if (authenticatedUserDetails != nullamp;amp; authenticatedUserDetails.HasToolAccess)
{
AuthenticatedUser authenticatedUser = new AuthenticatedUser();
authenticatedUser = authOutput["AuthenticatedUser"];
cachedUser.UserID = authenticatedUser.UserId;
cachedUser.UserEmpId = authenticatedUser.UserEmpId;
cachedUser.DepartmentId = authenticatedUser.DepartmentId;
cachedUser.Department = authenticatedUser.Department;
tokenStore.SaveUserDetails(cachedUser);
}
else
{
string message = "User Details return null";
notification.HandleResponse();
notification.Response.Redirect($"/Home/Error?message={message}amp;debug={message}");
} else
{
string message = authOutput["Exception"];
notification.HandleResponse();
notification.Response.Redirect($"/Home/Error?message={message}amp;debug={message}");
}
Здесь, как только приложение accesstoken
успешно получено, оно вызывает метод входа в API для получения других сведений о пользователе
authOutput =await methodHelper.AuthorizeUserByEmailID(cachedUser.Email);
выполняет эту задачу.
Это работает совершенно нормально, когда в систему входит меньше пользователей. Но вдруг днем. Приложение перестает работать, и все пользователи снова и снова перенаправляются на экран входа в систему. Until the Web App is restarted
.
Ответ №1:
Пожалуйста, проверьте свой тег Forms в файле web.config, возможно, вы указали URL-адрес ~/входа.
Я добавил loginUrl как ~/Логин в свой конфигурационный файл и заметил ту же проблему , я изменил перенаправление на «~/Индекс» , для меня это сработало нормально.
Измените форму loginUrl в своей конфигурации на существующий маршрут индекса «~/Индекс», если у вас есть или создайте новое действие для обработки этого маршрута.
<authentication mode="Forms">
<forms loginUrl="~/Account/Index" name="AuthClientUser"
timeout="60" slidingExpiration="true" cookieless="UseCookies"
path="/">
</forms>
</authentication>
И добавьте следующее в раздел Настройки приложений в web.config
<add key="autoFormsAuthentication" value="false" />
<add key="enableSimpleMembership" value="false"/>
Раздел авторизации web.config запрещает доступ всем анонимным пользователям.
Комментарии:
1. Спасибо за ваш ответ, Харшита, Вот мой код конфигурации файлов cookie app.UseCookieAuthentication(новые функции проверки подлинности cookies { CookieSecure = Функция проверки подлинности cookies. Всегда, CookieManager = новый SystemWebChunkingCookieManager(), Тип аутентификации = «Файлы cookie», Путь входа = новая строка пути(«/Учетная запись/Вход»), путь выхода = новая строка пути(«/Учетная запись/Выход»), ExpireTimeSpan = Промежуток времени. FromHours(2), SlidingExpiration = true, });
2. Я попробовал это решение, но, к сожалению, оно не сработало
3. Пожалуйста , проверьте раздел авторизации web.config, который запрещает всем анонимным пользователям.