2015-12-21 4 views
0

шаблон по умолчанию asp.net mvc6 с индивидуальным счетом имеет следующие методы в AccountControllerУсловный AllowAnonymous

// GET: /Account/Register 
[HttpGet] 
[AllowAnonymous] 
public IActionResult Register() 
{ 
    return View(); 
} 

// 
// POST: /Account/Register 
[HttpPost] 
[AllowAnonymous] 
[ValidateAntiForgeryToken] 
public async Task<IActionResult> Register(RegisterViewModel model) { 
    ... 
} 

Я хочу реализовать что-то простого, что позволит анонимный доступ к Register методе только если пользователя уже нет.

Это нормально/хорошо расширять фильтр AllowAnonymous, поэтому проверка Db перед возвратом true/false или я должен каким-то образом реализовать политику?

Если расширение атрибута или использование настраиваемой политики не являются хорошим решением, что вы рекомендуете?

Будет приятно, если бы кто-нибудь мог направить меня с образцом, где/как пользовательская логика.

Идея для раздела администратора, поэтому только зарегистрированные пользователи не могут регистрировать новые. Но если пользователь не зарегистрирован (сначала развертывается в пустой базе данных), я хочу, чтобы пользователь мог зарегистрироваться с именем пользователя/паролем.

Примечание с точки зрения безопасности: Имейте в виду, что могут регистрироваться только электронные адреса, которые могут быть зарегистрированы, поэтому даже если случайный пользователь попадает на страницу регистрации публичного лица, когда пользователь уже не зарегистрирован, он не сможет зарегистрировать его/ее личный адрес электронной почты

Если я возьму любое дополнительное соображение безопасности, я буду открыт, чтобы прочитать о них.

ответ

2

Поскольку это всего лишь одноразовая вещь, я просто проведу проверку непосредственно в Register. Создание пользовательского атрибута для украшения одного действия с помощью метода overkill.

[HttpGet] 
[AllowAnonymous] 
public IActionResult Register() 
{ 
    if (db.Users.Any()) 
    { 
     return new HttpStatusCodeResult(HttpStatusCode.Forbidden); 
    } 

    return View(); 
} 

Технически, так как ваше сообщение действие CSRF защищен, нет никакого способа, чтобы успешно завершить пост без удара действие ПОЛУЧИТЬ первым, но только, чтобы быть полным, вы можете добавить код для обоих, если вы хотите ,

+0

Интересно. Чтобы защитить пост-операцию, я должен использовать соль для этого конкретного метода, чтобы кто-то не мог использовать токен из другой части сайта. Правильно? –

Смежные вопросы