2010-05-18 1 views
6

Я разрабатываю веб-приложение в ASP.NET/C#, где каждый зарегистрированный пользователь имеет возможность добавлять/изменять/удалять строки на основе их идентификатора пользователя.Подход безопасности в веб-приложении

Возьмем такой пример:

Я собираюсь изменить свой маршрут на странице /route.aspx?routeid=854, которая принадлежит мне (ID пользователя: 1).

Но поскольку я любопытный парень, я пытаюсь получить доступ к /route.aspx?routeid=855 что принадлежит другому пользователю (идентификатор пользователя: 2).

Как я могу лучше избегать доступа людей к данным других народов? Должен ли я отправлять каждый идентификатор пользователя (из сеанса) с каждым вызовом базы данных, должен ли я проверять пользователя/пароль на каждой загрузке страницы или что является лучшим и наиболее безопасным?

Надеюсь, я сделал это достаточно ясно.

ответ

3

НЕ РЕИНВЕНТЕНТ КОЛЕСА

Редактировать: Сохранение UserId - вам не обязательно. Вы можете получить его от MembershipProvider в любое время до тех пор, пока пользователь вошел в систему, конечно:

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

Звуки для меня, как вы должны реализовать поставщика членства ASP.NET. Есть чтения этого ресурса: http://odetocode.com/articles/427.aspx

Кроме того, хорошая серия от Скотта Гатри: http://weblogs.asp.net/scottgu/archive/2006/02/24/ASP.NET-2.0-Membership_2C00_-Roles_2C00_-Forms-Authentication_2C00_-and-Security-Resources-.aspx

В общем, этот подход: Используйте проверку подлинности форм для проверки, которые пользователь. Это защищенная сторона проверки подлинности. То есть, определение пользователя - это тот, кто, как они говорят, обычно, с именем пользователя и паролем.

Вторая часть безопасности - это авторизация, которая происходит, когда вы знаете, кто такой пользователь. В основном это определение того, к каким ресурсам имеет доступ аутентифицированный пользователь. Зрелая система будет включать в себя следующие объекты:

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. 

Таким образом, чтобы предоставить пользователю доступ к routeid 854 (ресурса) можно предоставить ресурс непосредственно пользователю или, если есть несколько пользователей, которые должны иметь acceses к этот ресурс и эти пользователи образуют естественную группу, затем создайте эту группу, предоставите ресурс группе и добавьте пользователя в группу.

Тогда вы можете получить доступ к User.Resources с помощью идентификатора ресурса, или вы можете защитить целую страницу с помощью

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

Есть много хороших вещей, доступных с помощью модели поставщика.

Редактировать: Что-то необходимо знать, если вы решили сохранить информацию о профиле ваших пользователей. Реализация ProfileProvider по умолчанию не особенно хороша. Скотт Гатри написал хорошую статью о поставщике на основе таблицы, который лучше: http://weblogs.asp.net/scottgu/archive/2006/01/10/435038.aspx

+0

Я использую поставщик ASP.NET MemberShip для входа в систему. Но приятно видеть информацию о пользовательских данных. :-) Продолжая читать об этом .. – janhartmann

+0

Хороший материал: здесь также есть хороший код примера: http://asp.dotnetheaven.com/aspnet/doc/security/membership.aspx#auth –

+0

Что касается сохранения UserId , посмотрите на Редактировать в верхней части моего ответа. –

3

Ваш лучший подход заключается в том, чтобы отправить userId в базу данных с помощью routeId, чтобы узнать, может ли пользователь получить к нему доступ.

что-то вроде:

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

Если вы используете что-то вроде Linq вы можете сделать гораздо лучше модель безопасности, применяя ограничение пользователя как с многоразовой функцией, как это:

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

Где лучше всего хранить этот идентификатор пользователя? Сессия? – janhartmann

+0

И должен ли я проверять текущий пользователь, соответствующий этому идентификатору пользователя при загрузке страницы? – janhartmann

+1

Сохраните серверную часть userID (например, в объекте Session) и НЕ на стороне клиента (например, в файле cookie). – Aurril