2016-10-10 2 views
0

Я работаю над веб-приложением ASP.NET Core с MVC6. Я хочу реализовать режим обслуживания в своем веб-приложении, чтобы только определенный тип пользователей мог войти в веб-приложение, когда он находится в режиме обслуживания. Например, пользователю разрешен вход пользователя пользователя EXCEPT с ролью user. Для достижения этой функциональности я пробовал использовать следующий код.Что касается режима обслуживания в ASP.NET Core

//Sign in user with provided username and password 
var res = await _signInManager.PasswordSignInAsync(suser.UserName, user.Password, user.Remember, false); 
if (res.Succeeded) 
{ 
     //check if web app is under maintenance mode and if it is, then check the role of the user 
     if (_env.IsEnvironment("Maintenance") && await _userManager.IsInRoleAsync(suser, "user")) 
      return View("Maintenance"); //if user is in 'user' role redirect to maintenance view 
     else 
     { 
      //else redirect to main page 
     } 
} 

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

ответ

1

Создайте действие фильтр или среднее изделие, который выполняет ту же проверку для каждого запроса

Чтобы прочитать больше о фильтрах, проверьте эту ссылку https://docs.asp.net/en/latest/mvc/controllers/filters.html

+0

Как использовать 'SignInManager' в пользовательском фильтре? –

+0

Вам не нужен 'SignInManager', только' UserManager' - это то, что вам нужно проверить, является ли пользователь в роли или нет, и вы можете получить его из текущего 'OwinContext', если вы используете VS по умолчанию шаблон, он обычно регистрирует экземпляр 'UserManager' в' OwinContext', и вы можете получить его, используя следующий код: 'using Microsoft.AspNet.Identity.Owin; с использованием Microsoft.AspNet.Identity; var manager = HttpContext.Current.GetOwinContext(). GetUserManager >(); ' –

+0

Что я хотел бы сделать в пользовательском фильтре, так это то, что сначала проверьте, находится ли веб-сайт в режиме обслуживания или нет (выполняется с использованием переменной окружения). затем проверьте, был ли пользователь уже зарегистрирован или нет. Если пользователь вошел в систему, а веб-сайт находится в режиме обслуживания, выйдите из него и перенаправите пользователя на страницу входа. После того, как пользователь выйдет из системы, и если пользователь попытается снова войти на веб-сайт в режиме обслуживания, тогда код, о котором я упоминал выше, обработает все остальное. –