2010-05-18 29 views
6

ASP.NET/C# 'da bir web uygulaması tasarlıyorum, burada her bir kayıtlı kullanıcı, kullanıcı kimliğine göre satır ekleme/değiştirme/silme özelliğine sahip. Web uygulamasında güvenlik yaklaşımları

bu örneği ele alalım: Ben bana ait sayfa /route.aspx?routeid=854 benim rotayı düzenlemek için gidiyorum

(kullanıcı id: 1).

Ama meraklı biri olduğum için başka bir kullanıcıya ait olan (kullanıcı kimliği: 2) /route.aspx?routeid=855'a erişmeye çalışıyorum.

İnsanların diğer insanlara ait verilere erişmesini nasıl önleyebilirim? Her kullanıcı kimliğini (oturumdan) her bir veritabanı çağrısı ile birlikte göndermem gerekirse, her sayfa yükünde kullanıcı/parola doğrulamalı mıyım yoksa en iyi ve en güvenli yaklaşım nedir?

Umarım bunu yeterince açık yapmışımdır.

cevap

3

: Eğer Linq gibi bir şey kullanıyorsanız

select * from route where [email protected] and [email protected] 

Böyle bir yeniden kullanılabilir fonksiyonlu gibi kullanıcı kısıtlama uygulayarak çok daha iyi bir güvenlik modeli yapabilir TEKRARLAMAYIN TEKRARLAMAYINIZ

Düzenleme: UserId saklamak - zorunda değilsiniz. Sürece kullanıcı elbette kaydedilir olarak her an MembershipProvider adresinden elde edebilirsiniz:

MembershipUser user = Membership.GetUser(); 
Guid UserID = user.ProviderUserKey; 

geliyor bana sen ASP.NET üyelik sağlayıcısı uygulamak gerekiyor gibi. http://odetocode.com/articles/427.aspx

Ayrıca Scott Guthrie iyi bir dizi: Bir kullanıcının kim doğrulamak için kullanın form kimlik doğrulaması: Genel olarak http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx

, bu yaklaşım bu kaynağın bir okuma var. Bu, güvenliğin Kimlik Doğrulama tarafıdır. Yani, kullanıcının belirledikleri kişi, genellikle kullanıcı adı ve parola ile belirlenir.

Güvenlik ikinci kısmı, kullanıcının kim olduğunu öğrendikten sonra gerçekleşen Yetkilendirme'dir. Bu temel olarak, kimliği doğrulanmış bir kullanıcının hangi kaynaklara erişebildiğini belirlemekten oluşur. Olgun sistemi aşağıdaki varlıkları içerecektir: Eğer kullanıcıya doğrudan kaynak vermek veya olabilir 854 (a Kaynak) routeid için bir kullanıcı erişimi vermek için, Böylece

User: may contain extended profile information captured on registration 
Resource: a page or other resource that can be restricted. 
Group: a group of users who can access resources due to their group membership (groups are granted resource access) 
Role: a type of user such as Administrator/Developer/Salesperson. 

için acceses olmalıdır birden çok kullanıcı varsa Bu kaynak ve bu kullanıcılar doğal bir grup oluşturur, daha sonra bu grubu oluşturur, kaynağı gruba verir ve kullanıcıyı gruba ekler.

Sonra bir kaynak kimliği eklenen User.Resources erişebilir veya sağlayıcı modeli kullanılarak mevcut çok iyi şeyler vardır

if(!User.IsInRole("RoleName")) 
{ 
    //redirect to access denied page 
} 

kullanarak tüm sayfayı koruyabilir.

Düzenleme: Something kullanıcılar hakkında profil bilgileri depolamak için karar farkında olmak: ProfileProvider varsayılan uygulaması özellikle iyi değil. Scott Guthrie bir tablo tabanlı sağlayıcıya iyi makale yazdı daha iyi: http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx

+0

Oturum açmak için ASP.NET Üye Gönderme sağlayıcısı kullanıyorum. Ama özel bilgiler hakkında biraz bilgi görmek güzel. :-) Daha fazla okumak için gidiyor .. – janhartmann

+0

İyi şeyler: Burada da iyi bir örnek kod var: http://asp.dotnetheaven.com/aspnet/doc/security/membership.aspx#auth –

+0

UserId saklamakla ilgili olarak , cevabımın en üstündeki Düzenle'ye bakın. –

3

En iyi yaklaşımınız, kullanıcı tarafından erişilip erişilemeyeceğini görmek için, userId işlevini rotaId ile veritabanına göndermek olacaktır.

gibi bir şey:

public Route Get(int routeId, int userId) 
{ 
    var query repository.Get<Route>().Where(r => r.Id == routeId); 
    query = applySecurityModel(query, userId); 
    return query.FirstOrDefault(); 
} 

private IQueryable<T> applySecurityModel<T>(IQueryable<T> query, int userId) where T : ISecurable 
{ 
    return query.Where(t => t.UserId == userId); 
} 

public interface ISecurable 
{ 
    int UserId { get; set; } 
} 

public class Route 
{ 
    int Id { get; set; } 
    int UserId { get; set; } 
} 
+0

Nerede Bu kullanıcının kimliğini saklamak için en iyi yoldur? Oturum, toplantı, celse? – janhartmann

+0

Geçerli kullanıcının, sayfa yüklendiğinde bu kullanıcı kimliğine karşılık geldiğini doğrulamalı mıyım? – janhartmann

+1

Kullanıcı kimliği sunucu tarafını (ör. Oturum nesnesinde) ve NOT istemci tarafını (ör. Bir çerezde) kaydedin. – Aurril

İlgili konular