При использовании объектов Newtonsoft и WindowsIdentity обнаружены циклы самоссылки? - PullRequest
0 голосов
/ 25 октября 2019

Я думаю, что я мог бы просто быть слепым к своему собственному коду, но код вылетает и говорит, что обнаружил цикл самоссылки. Я не совсем уверен, как мне это удалось. Я делаю проект 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;
    }
}
...