Я думаю, что я мог бы просто быть слепым к своему собственному коду, но код вылетает и говорит, что обнаружил цикл самоссылки. Я не совсем уверен, как мне это удалось. Я делаю проект MVC / ASP на работе с использованием .NET Core 2.2. Мы должны сохранить пользователя в файле cookie сеанса, чтобы мы могли использовать личность пользователя до завершения сеанса с помощью проверки подлинности Windows. Поэтому я делаю следующее:
public async Task<IActionResult> Index(int? id)
{
// Get the User from a Session Cookie.
WindowsIdentity sessionBruger = AdHelper.HentBrugerFraSessionCookie(HttpContext);
// Is this user valid?
if (sessionBruger != null)
{
// then store this user in a private property on the controller that called the code.
_user = sessionBruger;
}
else
{
// If it wasn't there, then set it up in the session Cookie.
// Start by getting the name of the Key from our Config file
string userKey = _configuration.GetSection("SessionKeys:User").Value;
// Get the Current Windows User
_user = AdHelper.HentNuvaerendeBruger(ref httpContextAccessor);
// Now add that to the Session Cookie for further use.
HttpContext.Session.Set(userKey, _user); // <-- this is where it breaks
}
Мне кажется, это довольно прямо, по крайней мере, верно? Я расширил объект Session, поскольку я сериализирую объект WindowsIdentity
, как и сказал Microsoft. В противном случае вы не можете сериализовать подобные объекты из коробки:
public static class SessionExtensions
{
public static void Set<T>(this ISession session, string key, T value)
{
session.SetString(key, JsonConvert.SerializeObject(value));
}
public static T Get<T>(this ISession session, string key)
{
string value = session.GetString(key);
return value == null ? default(T) : JsonConvert.DeserializeObject<T>(value);
}
}
Эта строка, где она разрывается, выглядит следующим образом:
HttpContext.Session.Set(userKey, _user);
В этот момент я определил, что пользовательеще не существует в файле cookie сеанса, поэтому я хочу добавить ссылку на WindowsIdentity
, который, как я знаю, я получил.
Чего мне здесь не хватает?
Для правильной меры,Вот код, используемый для проверки того, что объект уже существует в Сессионном Cookie:
/// <summary>
/// Checks whether a user has already been added to the Session Cookie or not.
/// </summary>
/// <param name="context">The HttpContext of the controller requesting the check.</param>
/// <returns>Returns the user if it is in the Session Cookie, otherwise null.</returns>
public static WindowsIdentity HentBrugerFraSessionCookie(HttpContext context)
{
string userKeyName = _config.GetSection("SessionKeys:User").Value;
try
{
WindowsIdentity bruger = context.Session.Get<WindowsIdentity>(userKeyName);
if (bruger == null)
{
return null;
}
else
{
return bruger;
}
}
catch (Exception e)
{
Console.WriteLine(e.Message);
return null;
}
}