Я использую https://github.com/mattmorg55/Owin.Security.Keycloak в качестве промежуточного программного обеспечения для аутентификации. компонент.
Проблема, с которой я столкнулся, возникает после входа в систему. Я заметил, что в некоторых случаях пользователь входит в систему как другой пользователь, хотя он предоставил правильные учетные данные для входа. Проблема возникает не так часто, поэтому я не могу предоставить воспроизводимый пример.
Все действия в контроллере имеют тег [Authorize], который после истечения времени ожидания сеанса заставляет пользователя войти на страницу входа. . Я использовал ClaimsPrincipal для декодирования токена доступа, предоставленного Keycloak, и получения необходимой информации.
Код: Выделить всё
using TestDashboard.DatabaseConnection;
using TestDashboard.IServices;
using TestDashboard.Models;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Security.Claims;
using System.Web;
using System.Web.Mvc;
namespace TestDashboard.Controllers.Special
{
public class MainController : Controller
{
//Called before the action method is called. Used for logging, caching, authorization
[Authorize]
protected override void OnActionExecuting(ActionExecutingContext ctx)
{
try
{
var userPrinciple = User as ClaimsPrincipal;
if (Session["userDetails"] == null)
{
//decode access token and set the required properties and store it to a 'userDetails' session
UserDetailsModel userDetailsModel = new UserDetailsModel().DecodeAccessToken(userPrinciple);
if (userDetailsModel.exceptionMessageModel.statusCode == System.Net.HttpStatusCode.Forbidden)
{
ThrowErrorPage("/Error/Forbidden");
}
else if (userDetailsModel.exceptionMessageModel.statusCode == System.Net.HttpStatusCode.InternalServerError)
{
ThrowErrorPage("/Error/InternalError");
}
else if (userDetailsModel.exceptionMessageModel.statusCode == System.Net.HttpStatusCode.BadRequest)
{
ThrowErrorPage("/Error/BadRequest");
}
else if (userDetailsModel.exceptionMessageModel.statusCode == System.Net.HttpStatusCode.NotFound)
{
ThrowErrorPage("/Error/Pagenotfound");
}
Session["userDetails"] = userDetailsModel;
}
}
catch (Exception e)
{
//log execption to elasticsearch
new ElasticsearchConnection().IndexExceptionDocument(e, GetType().Name, System.Reflection.MethodBase.GetCurrentMethod().Name);
System.Diagnostics.Debug.WriteLine(" Exception in Class Name-> " + GetType().Name + ", Method Name-> " + System.Reflection.MethodBase.GetCurrentMethod().Name + ", Error-> " + e.Message);
ThrowErrorPage("/Error/InternalError");
}
}
public ActionResult ThrowErrorPage(string pathToError)
{
return Redirect(pathToError);
}
}
}
Подробнее здесь: https://stackoverflow.com/questions/792 ... erent-user