---
title: "Inte trådsäkert"
type: "forum-thread"
url: "https://www.webforum.nu/amne/dotnet/171787-inte-trådsäkert"
topic: ".NET"
topic_url: "https://www.webforum.nu/amne/dotnet"
author: "doggelito"
published: "2008-05-26T12:35:33.000Z"
updated: "2008-05-27T13:19:28.000Z"
replies: 7
views: 785
page: 1
pages: 1
language: "sv-SE"
site: "webForum — webforum.nu"
rights: "Upphovsrätten till varje inlägg tillhör dess författare."
attribution: "Citera som: webForum, https://www.webforum.nu/amne/dotnet/171787-inte-trådsäkert"
---

# Inte trådsäkert

## #1 — doggelito, 2008-05-26T12:35Z

Har stött på patrull!
En inloggad användare har lyckats få en annan inloggad användares användarinfo.

Jag använder en statisk användarklass med bla en sessionvariabel och ett cacheobjekt. Felet bör ligga där i.

Är inte denna kod trådsäker? Hur kan den förändras/förbättras?

```
public static class UserInfo
{
    static string currentUserName = String.Empty;

    //Sessionvariabel som håller en användarens användarnamn
    public static string CurrentUserName
    {
        get
        {
            if (HttpContext.Current.Session["UserName"] != null)
            {
                currentUserName = HttpContext.Current.Session["UserName"].ToString();
            }
            return currentUserName;
        }
        set { HttpContext.Current.Session["UserName"] = value; }
    }

    static Entities.User currentUser;

    //Cache objekt som håller en användare
    public static Entities.User CurrentUser
    {
        get
        {
            if (CurrentUserName.Length > 0)
            {
                if (HttpContext.Current.Cache["UserWork" + CurrentUserName] != null)
                    currentUser = (Entities.User)HttpContext.Current.Cache["UserWork" + CurrentUserName];
                else
                {
                    //CurrentUser kan/får aldrig vara tom
                    HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
                }
            }
            else
                HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");

            return currentUser;
        }
        set
        {
            currentUser = value;
            HttpContext.Current.Cache["UserWork" + CurrentUserName] = currentUser;
        }
    }
}
```

Permalänk: https://www.webforum.nu/p/171787

## #2 — Erik Juhlin, 2008-05-26T12:57Z

Jag kan inte se att currentUserName deklareras nånstans. Jag som är blind?

Permalänk: https://www.webforum.nu/p/2112603

## #3 — doggelito, 2008-05-26T13:12Z

Sorry, glömde visst den raden. Koden uppdaterad!

Permalänk: https://www.webforum.nu/p/2112608

## #4 — spango, 2008-05-26T13:34Z

Nej, det finns ju bara en currentUserName, så använder fler den samtidigt krockar det.Vad behöver du den till? Ta bort den och gör så här istället:

```
    public static string CurrentUserName
    {
        get { return (string)HttpContext.Current.Session["UserName"]; }
        set { HttpContext.Current.Session["UserName"] = value; }
    }
```

Om du verkligen skulle vilja ha den lagrad i ett fält skulle du få dekorera fältet med \[ThreadStatic\], men som sagt; du behöver den inte.

**red.** Sen får du ändra på ditt villkor också:

```
// byt 
if (CurrentUserName.Length > 0)
// mot
if (CurrentUserName != null)
```

**red.** potentiellt nullfel

Permalänk: https://www.webforum.nu/p/2112610

## #5 — doggelito, 2008-05-27T11:30Z

Tack! :bire
Jag återkommer om det mot förmodan fortfarande inte funkar!

Permalänk: https://www.webforum.nu/p/2112747

## #6 — spango, 2008-05-27T11:56Z

Förresten, du vill ta bort currentUser också.

```
    public static Entities.User CurrentUser
    {
        get
        {
            string userName = CurrentUserName;
            if (userName != null)
            {
                Entities.User user = HttpContext.Current.Cache["UserWork" + userName];
                if (user == null)
                {
                    //CurrentUser kan/får aldrig vara tom
                    HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
                }
                return user;
            }
            else
            {
                HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.");
                return null;
            }
        }
        set
        {
            HttpContext.Current.Cache["UserWork" + CurrentUserName] = currentUser;
        }
    }
```

Permalänk: https://www.webforum.nu/p/2112751

## #7 — doggelito, 2008-05-27T12:25Z

Mm, jag var inne på lite samma sak, jag återskapade dock CurrentUser om CurrentUserName inte är tom, så här:

```
public static Entities.User CurrentUser
{
    get
    {
        if (CurrentUserName != null)
        {
            if (HttpContext.Current.Cache["UserWork" + CurrentUserName] != null)
                return (Entities.User)HttpContext.Current.Cache["UserWork" + CurrentUserName];
            else
            {
                IGenericDao<Entities.User> UserDao = new GenericDao<Entities.User>();
                return UserDao.GetObject(Expression.Eq("UserName", CurrentUserName));
            }
        }
        else
            HttpContext.Current.Response.Redirect("/?Msg=Din session har avslutats och du behöver logga in igen.", true);

        return null;
    }
    set
    {
        HttpContext.Current.Cache["UserWork" + CurrentUserName] = value;
    }
}
```

Är min kod överflödig?
Kommer cacheobjektet CurrentUser någonsin att kunna vara tomt om CurrentUserName inte är tom?

För jag sätter dem samtidigt när användaren loggar in:

```
UserInfo.CurrentUserName = "arne";
UserInfo.CurrentUser = användare från databas;
```

Sedan rör jag dem inte mer.
Så då måste väl cachen finnas minst lika länge som sessionvariabeln? Eller kan cachen på något sätt avslutas när inte session gör det?

Permalänk: https://www.webforum.nu/p/2112756

## #8 — spango, 2008-05-27T13:19Z

Det är inte helt otroligt att cachen kan tömmas (har inte koll på exakt hur det går till i ASP.NET dock) så nej, din kod är nog inte helt onödig, nej.

Permalänk: https://www.webforum.nu/p/2112770

---

Tråden på webben: https://www.webforum.nu/amne/dotnet/171787-inte-trådsäkert
