2011-02-09 9 views
9

ja chcąc buforują role użytkownik jest w dla każdego wniosku, że jest w Istnieje kilka miejsc w całej każdej stronie, gdzie gdzie mamy coś takiego:Per-Request dane statyczne w ASP.NET

<% if(Roles.IsUserInRole("RoleName")) {%> 
    <!-- Conditional Rendering --> 
<% } else if(Roles.IsUserInRole("AnotherRole") {%> 
    <!-- You get the point --> 
<% } %> 

Ponieważ wszystko jest przechowywane w bazie danych SQL, każde z tych żądań trafia do bazy danych. Wiem, że istnieją sposoby buforowania ról w pliku cookie, ale nie chcę tego robić. W każdym razie, to, co myślałem, było coś takiego.

public static class SecurityUtils 
    { 
     public static string[] UserRoles() 
     { 
      var context = HttpContext.Current; 

      if (context == null) return Enumerable.Empty<string>(); 

      string[] roles; 

      roles = context.Items["UserRoles"] as string[]; 

      if (roles == null) 
      { 
       roles = Roles.GetRolesForUser(); 
       context.Items["UserRoles"] = roles; 
      } 

      return roles; 
     } 
    } 

Ktoś widzi jakieś problemy z tym? Wiem, że kiedykolwiek zadzwonię pod numer UserRoles(), który zajrzy przedmiot w kontekście i być może nie jest to najskuteczniejsza rzecz do zrobienia. To, co naprawdę chcę wiedzieć, to to, czy będzie to buforowanie na żądanie, więc nie ma nakładania się z innymi żądaniami użytkowników.

+0

Masz wołowinę z 'Sesją'? – bzlm

+0

@bzlm - być może role nie są "szeregowalne"? – Oded

+3

@Oded Masz rację. Może 'string []' w przykładowym kodzie w pytaniu odnosi się do tęczy i jednorożca zamiast sekwencji liter i cyfr. – bzlm

Odpowiedz

11

Wygląda na to wystarczająco bezpiecznie na szybki rzut oka. HttpContext.Current.Items to pamięć podręczna żądań HTTP. Inną możliwością rozważenia dalszego ograniczenia wywołań baz danych byłoby użycie stanu sesji.

Rozważ scenariusz, w którym masz stronę z wieloma rzeczami dotyczącymi ajaxów. Każde żądanie ajax wywoła wywołanie bazy danych w celu załadowania ról bezpieczeństwa, ponieważ wszystkie są osobnymi żądaniami HTTP.

+0

To świetny punkt na temat żądań ajaxowych i takich. Prawdopodobnie wykorzystam sesję, ale upewnij się, że zostanie wyczyszczona, jeśli użytkownik doda lub zmieni role. – Micah

+0

Wskażę prawdopodobnie oczywiste zastrzeżenie do używania sesji w celu zmniejszenia wywołań baz danych - można skonfigurować faktycznego dostawcę sesji do bazy danych lub serwera zewnętrznego (np. Redis, AWS DynamoDb), więc należy zwrócić uwagę na to, w jaki sposób środowisko jest Ustawiać. – drzaus

+0

Wiem, że to jest stare, ale myślę, że miałeś na myśli 'HttpContext' zamiast' HttpContent' – Davy8

3

Będzie buforować to na żądanie, ponieważ używasz bieżącego HttpContext.

Jeśli używasz statycznego elementu, zostanie on zbuforowany, dopóki aplikacja internetowa nie zostanie poddana recyklingowi.

Jako taki wygląda dobrze - dość powszechny wzór w rzeczywistości (przy użyciu statycznego elementu jako pamięci podręcznej w pamięci lub bieżącego HttpContext).

+1

@Oded: Czy możesz to wyjaśnić: * To zostanie zapisane w pamięci podręcznej, dopóki aplikacja internetowa nie będzie przetwarzać. *? –

+0

Rozumiem, że HttpContext.Items to pamięć podręczna dla żądań, czy tak nie jest? To znaczy. http://www.4guysfromrolla.com/articles/060904-1.aspx –

+0

@Ladislav Mrnka - Istnieje domyślna ilość czasu, zanim aplikacja internetowa .NET zresetuje się. Mam na myśli, dopóki nie zostanie zresetowany, ręcznie lub automatycznie. – Oded