Я начну с решения, затем объяснения и рекомендации.
Создание пользовательского атрибута авторизации:
Поскольку ваше приложение определяет Authorized
следующим образом:
- Зарегистрировался
- Должны иметь значения в
Session["UserID"]
и Session["Password"]
вам нужно определить свой собственный AuthorizationAttribute
public class AuthorizedWithSessionAttribute : AuthorizeAttribute
{
protected override bool AuthorizeCore(HttpContextBase httpContext)
{
if(httpContext.Request.IsAuthenticated &&
Session["UserID"] != null && Session["Password"] != null)
return true;
// sign them out so they can log back in with the Password
if(httpContext.Request.IsAuthenticated)
FormsAuthentication.SignOut();
return false;
}
}
Замените все свои атрибуты [Authorize]
на [AuthorizedWithSession]
, и вам не нужно помещать код проверки сеанса в свои контроллеры.
Я недостаточно знаю о вашем приложении, но сохранение паролей в сеансе (что еще хуже в текстовом формате) не является безопасным занятием.
Кроме того, как сказано в RPM1984
, cookie сеанса и cookie аутентификации являются отдельными.
Пояснение:
Думайте о сессии как о пакете информации (на стороне сервера) с вашим именем на нем. ASP.NET может взять и положить вещи в это ведро. ASP.NET дает вам имя, идентификатор вашей сессии и помещает его в корзину, чтобы он мог узнать, какая из них ваша.
Файл cookie для аутентификации сообщает ASP.NET, что вы прошли аутентификацию, и сохраняет в нем ваше имя для аутентификации. Имя аутентификации обычно устанавливается разработчиком приложения и обычно является уникальным ключом (например, первичный ключ в БД), чтобы отделить вас от других пользователей.
Рекомендация для большей безопасности:
Зашифруйте пароли перед тем, как хранить их. Это не полная безопасность, но это лучше, чем хранить пароли в виде простого текста, и, конечно, если кто-то получит ключ шифрования, он может взломать пароли.