Как реализовать разрешения пользователей на основе репутации, такие как SO?

вы можете подумать, что этот вопрос должен быть в Meta SO, но это не так, поскольку он в основном касается ASP.Net MVC, но техника, которую я хочу реализовать, уже реализована в SO.

Я хочу, чтобы у пользователей была власть, пока они приобретают больше репутации, как мы это делаем в StackOverflow, и мой вопрос заключается в том, как разработать систему аутентификации пользователей? Можем ли мы положиться на встроенную аутентификацию с помощью форм? и как управлять какие ссылки (в зависимости от репутации) показывать пользователю, а какие нет?

Я думаю, что мы не можем использовать роли здесь, чтобы у нас не было 1000 ролей, верно? но мы можем использовать только 2 роли (администратор, пользователь).

[Edit]:
Я думаю, что лучше создать свою собственную таблицу пользователей, а не зависеть от проверки подлинности с помощью форм, и поэтому я могу добавить поле репутации (и другие поля) в таблицу пользователей и отслеживать его, как вы сказали. Кстати, @MartinHN, я знаю о if, о котором вы говорили, но мой вопрос: есть ли более разумный способ справиться с такими вещами?


person Ken D    schedule 28.06.2011    source источник
comment
Я предполагаю, что SO обрабатывает разрешения репутации внутри, и каждый обычный пользователь является просто пользователем, но я никогда не видел источник, так что это WAG.   -  person    schedule 28.06.2011
comment
Вы путаете аутентификацию и авторизацию? StackExchange использует OpenID для аутентификации, которая не определяет ваши разрешения.   -  person Paul Turner    schedule 28.06.2011
comment
Нет, я просто хотел найти систему, которая может позволить себе как простоту обслуживания, так и расширение в будущем.   -  person Ken D    schedule 28.06.2011


Ответы (2)


Вы можете создать простую систему правил. У каждого пользователя есть связанная с ним оценка репутации. Затем, используя фильтр действий, вы можете контролировать доступ к функциям в ваша система:

public class SomeController : IController
{
    ...
    [ReputationNeeded(Reputations.CanVoteDown)] // your custom action filter
    [HttpPost]
    public ActionResult VoteDown(...)
    { /* */ }
}

Удачи!

person Daniel Lidström    schedule 28.06.2011
comment
+1 Большое спасибо, это часть того крутого материала, который я хотел. - person Ken D; 28.06.2011
comment
Еще вопрос, пожалуйста, как получить доступ к объекту пользователя (а затем к репутации) в классе фильтра действий? Я имею в виду, что это не является частью контекста, как это обойти? - person Ken D; 28.06.2011
comment
Есть много способов, я думаю. Один из них обсуждается здесь: stackoverflow.com/questions/5758611/. - person Daniel Lidström; 28.06.2011
comment
Я прошел через это и увидел много вещей Ninject, которые, похоже, когда-нибудь будут многообещающими :) - person Ken D; 28.06.2011

Управление репутацией пользователя и тем, к чему у него есть доступ (измеряется репутацией), не должно быть частью самого механизма аутентификации, ИМХО.

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

Я бы не стал делать эту функцию частью системы аутентификации. Я бы просто позволил пользователям аутентифицироваться, а затем отображать соответствующие представления для любого пользователя.

Скажем, ваша основная навигация меняется в зависимости от репутации. Вы оборачиваете элементы панели навигации, требующие более 1000 повторений. с оператором if и не показывать его, если у пользователя меньше 1000.

person MartinHN    schedule 28.06.2011