Подход к безопасности в веб-приложении - PullRequest
6 голосов
/ 18 мая 2010

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

Возьмите этот пример:

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

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

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

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

Ответы [ 2 ]

3 голосов
/ 18 мая 2010

НЕ ПОВЫШАТЬ КОЛЕСО

Редактировать: сохранение идентификатора пользователя - вам не нужно. Вы можете получить его от 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 (Ресурсу), вы можете предоставить ресурс непосредственно пользователю или, если есть несколько пользователей, которые должны иметь доступ к этому ресурсу, и эти пользователи образуют естественную группу, затем создайте это group, предоставьте ресурс группе и добавьте пользователя в группу.

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

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

В модели провайдера доступно много хороших вещей.

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

3 голосов
/ 18 мая 2010

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

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

select * from route where routeId=@routeId and userId=@userId

Если вы используете что-то вроде 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; }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...