Krzysiek Z. Programista ASP.NET
Temat: ASP.NET + MVC3 Sesje
Potrzebuje jakiś informacji na temat sesji w MVC 3. Jak z nich korzystać? Mam formularz do logowania dla użytkownika, po wprowadzeniu poprawnych danych przekazuje do sesji obiekt klasy admin (zawiera adminid, adminlogin, name, email)HttpContext.Session.Add("adminLogin", administrator); Jak korzystając z sesji mogę kontrolować dostęp do pewnych fragmentów strony? Czy istnieje możliwość pobrania pewnych danych z sesji w widoku? Czy oprócz sesji można w jakiś sposób zabezpieczyć dostęp nieuprawionych osób do strony? W niektórych aplikacjach dane sesji przechowywane są w bazie danych, w jakim celu? Z góry dziękuję za pomoc
Grzegorz
Kmiecik
Inżynier ds.
Testowania i
Oprogramowania,
Intel Technolog...
Temat: ASP.NET + MVC3 Sesje
Generalnie zabezpieczenia strony implementuje się za pomocą klasy która dziedziczy po MembershipProvider (np SqlMemebrshipProvider)m.in. tu step by step http://helios.ca/2009/04/22/aspnet-mvc-sqlmembershippr... , dzięki temu potem masz w kodzie możliwość określenia czy user IsAuthenticated albo IsInRole itp.
Nie korzystałem nigdy z sesji jako takich do implementacji zabezpieczenia stron i nie wiem czy tak się tak w ogóle robi.. ale w MVC korzysta się ze stworzonych userów i ról w bazie(patrz link wyżej) + AuthorizeAttribute nakładany na klasę, który daje "dostępy" w zależności od logiki (patrz tutaj:
http://stackoverflow.com/questions/1151450/how-to-impl...
Dane sesji mogą być przetrzymywane m.in w sql zależy to tylko i wyłącznie od konfiguracji i infrastruktury. Nie ma to znaczenia dla asp.net czy te dane bedą w sql czy w pamięci(InProc) czy w jakimś innym rozwiązaniu(Custom).
Bogdan
Pieńkowski
Konsulting,
programowanie
(.NET), analizy,
bazy danych. ...
Temat: ASP.NET + MVC3 Sesje
Możesz np. kontrolować dostęp do strony za pomocą ról jak pisał Grzegorz.namespace Sales.Controllers
{
[Authorize(Roles = "Sales,Admin,SuperAdmin,Test") ]
public class ProductsController : Controller
{
IProductRepository productRepository;
public ProductsController()
{
productRepository = new ProductRepository();
}
...
lub nazwą usera
[Authorize(Users="Adam,Iss,Marek,Test")]
lub połączenie z nazwą usera i rolami
[Authorize(Roles="UsersRole", Users="Adam,Iss,Marek,Test")]Bogdan Pieńkowski edytował(a) ten post dnia 24.08.11 o godzinie 18:21
Maciek
Kański
Programista C#
ASP.NET
Temat: ASP.NET + MVC3 Sesje
Z sesji w MVC korzystasz normalnie tak jak w ASP.NET. Ja też przechowuję w niej aktualne role użytkownika - wydaje mi się, że to popularny pattern.W widoku dobierasz się do sesji normalnie tj. przez ViewContext.HttpContext.Session. Ja jednak potworzyłem swoje helperki:
using System.Web.Mvc;
namespace MvcApplication1.Models {
public static class MyHtmlHelper {
public static MvcHtmlString RenderLoginBox(this HtmlHelper htmlHelper) {
if (null != htmlHelper.ViewContext.HttpContext.Session["adminLogin"]) return MvcHtmlString.Create("Jestes adminem");
else return MvcHtmlString.Create("zwykly user");
}
}
}
i wtedy użycie z widoku (Razor)
@using MvcApplication1.Models;
@Html.RenderLoginBox();
Możesz robić wszystko: warunkowo renderować różne partial widoki lub nawet podmieniać mastera
Czy oprócz sesji można w jakiś sposób zabezpieczyć dostęp nieuprawionych osób do strony?Autoryzacja to nie odpowiedzialność sesji. W MVC służą do tego AuthorizeAttribute - trzeba by jednak napisać własną wersję, co dzięki rozszerzalności MVC jest raczej łatwe (rejestrując atrybut globalnie - nowość MVC3). O ile pamiętam, nadpisujesz AuthorizeAttribute.AuthorizeCore(HttpContextBase) i tam sam sobie z sesji odczytujesz role i decydujesz co wolno a co nie.
W niektórych aplikacjach dane sesji przechowywane są w bazie danych, w jakim celu?trwałość danych - po upadku zasilania dane w sesji ciągle istnieją (o ile klient nie zapomniał swojego cookie). Ja osobiście uważam, że to przesada i mi wystarcza StateServer nawet w trakcie developerki - wtedy rekompilacja projektu nie gubi danych w sesji i nie muszę od nowa przechodzić procesu logowania.
