1 listopada 2006
Odsłon: 1152
Spotkałem się wczoraj z bardzo dziwnym problemem przy tworzeniu strony w ASP.NET, korzystającej z wbudowanych mechanizmów logowania. Rozwikłanie tego zajęło mi ładnych kilka godzin i do tej pory nie znam jeszcze wszystkich przyczyn moich kłopotów. Może komuś poniższe informacje się przydadzą gdyby napotkał na taki sam problem.
Wszystko zaczęło się od wstawienia na stronę kontrolki do logowania i włączenia Forms Authentication w web.config. Wcześniej oczywiście odpaliłem aspnet_regsql.exe i stworzyłem bazę dla wbudowanych mechanizmów autoryzacji ASP.NET. Jak wiadomo, w takim przypadku ASP.NET tworzy w katalogu App_Data naszej strony plik ASPNETDB.MDF - bazę typu user instance, w której przechowywane są m.in. dane użytkowników. To jest standardowe podejście i nigdy nie miałem z tym problemów - aż do teraz...
Problem uaktywnił się po utworzeniu w IIS katalogu wirtualnego dla strony i ustawieniu w Start Options - Use custom server (http://localhost...) zamiast serwerka wbudowanego w Visual Studio (na którym wszystko działało bez zarzutu). Ku swojemu zdziwieniu, przy próbie zalogowania otrzymywałem komunikat "incorrect user name or password". Natomiast po wybraniu opcji przypomnienia hasła, ASP.NET rzucał wyjątek z komunikatem: "update of ASPNETDB.MDF failed because the database is read-only". O co chodzi?
Zanim z pomocą znajomych udało mi się to rozwiązać, wypróbowałem chyba wszystkie wskazówki jakie znalazłem w sieci plus trochę własnych pomysłów - w sumie chyba kilkadziesiąt prób... Najpierw sądziłem, że obecność dwóch instancji SQL Server 2005 może powodować jakieś komplikacje - reinstall. Potem podejrzewałem (i chyba częściowo słusznie) IIS - reinstall. Potem .NET Framework - repair. Z użyciem Filemona analizowałem dostęp do problematycznego pliku - nadal zero sensownych wniosków.
Próbowałem przeróżnych ustawień w konfiguracji SQL Server, attach i detach bazy, dodawanie loginów i użytkowników. Grzebałem w web.config i machine.config, connection stringach do bazy oraz w konfiguracji IIS i katalogów wirtualnych. Przerabiałem projekty w Visual Studio i tworzyłem nowe żeby wytestować sprawę. I wiele, wiele innych podejść, a i tak zawsze dostawałem ten sam złowieszczy komunikat. Co gorsza, inni nie mieli żadnych kłopotów tego rodzaju na swoich systemach.
W końcu za radą kumpla - Bartka, spróbowałem pogrzebać w uprawnieniach NTFS do katalogów. Opcje folderów -> Widok -> Simple file sharing off, a potem przydzieliłem uprawnienia wszystkim do wszystkiego (Właściwości -> Zabezpieczenia) na katalogu ze stroną oraz na App_Data i... zadziałało! Nadal nie wiem jednak, co było przyczyną odbierania tych uprawnień. Najbardziej prawdopodobna wydaje się tu wina IIS, który mógł coś w ten sposób zabezpieczać. Tylko dlaczego u innych ten problem nie występował?
Dodam, że to wszystko działo się na laptopie z Windows XP SP2, IIS 5.1, Visual Studio 2005 Professional, SQL Server 2005 & SQL Server 2005 Express. Mam nadzieję, że jeśli ktoś napotka na taki sam kłopot, to powyższy tekst pomoże mu zaoszczędzić te kilka godzin...