#c# #.net-core
#c# #.net-ядро
Вопрос:
В предыдущих версиях .NET sdk мы реализовали следующий код:
[SecurityPermission(SecurityAction.Demand, SerializationFormatter = true)]
protected HttpResponseException(SerializationInfo info, StreamingContext context)
: base(info, context)
{
ErrorId = (Guid)info.GetValue("ErrorId", typeof(Guid));
StatusCode = (HttpStatusCode)info.GetValue("StatusCode", typeof(HttpStatusCode));
ShouldLog = info.GetBoolean("ShouldLog");
}
Я перешел на .NET 5, и мы начали сталкиваться с большим количеством предупреждений по этому поводу:
SecurityPermissionAttribute is deprecated: Code Access Security is not supported or honored by the runtime
Каков правильный способ его переноса? Просто удалить аннотацию или подавить предупреждающее сообщение?
Ответ №1:
API-интерфейсы Code Access Security (CAS) нефункциональны во всех .NET Core вплоть до .NET 5.
Другими словами: они … ничего не делают.
Типы были перенесены из .NET Framework 4, чтобы упростить миграцию кода, и ничего более — только для того, чтобы избежать ошибок компиляции. В некоторых случаях вы даже можете получить PlatformNotSupportedException
.
Вы можете оставить все это на данный момент, но поскольку оно ничего не делает, оно служит только одной цели: служить напоминанием о том, что (а) вам следует рассмотреть возможность его удаления, в то же время (б) оценивая причины, по которым оно было добавлено какие гарантии замены вы могли бы добавить, чтобы что-то получить это похоже на защиту, которую он предоставил вам в .NET Framework.
Более подробная информация здесь:
https://docs.microsoft.com/en-us/dotnet/core/compatibility/core-libraries/5.0/code-access-security-apis-obsolete
Ответ №2:
Согласно документам Microsoft:
Если вы утверждаете какое-либо разрешение безопасности, удалите атрибут или вызов, который утверждает это разрешение.
Если вы отказываете или ограничиваете (только с разрешения) какое-либо разрешение, обратитесь к своему консультанту по безопасности. Поскольку атрибуты CAS не поддерживаются средой выполнения .NET 5.0 , в вашем приложении может быть дыра в безопасности, если оно неправильно использует инфраструктуру CAS для ограничения доступа к этим методам.
Если вы требуете какого-либо разрешения (кроме PrincipalPermission), удалите требование. Все требования будут выполнены успешно во время выполнения.
Если вы требуете PrincipalPermission, обратитесь к руководству для PrincipalPermissionAttribute устарел как ошибка. Это руководство применимо как к PrincipalPermission, так и к PrincipalPermissionAttribute.
Если вам абсолютно необходимо отключить эти предупреждения (что не рекомендуется), вы можете отключить предупреждение SYSLIB0003 в коде.
Итак, поскольку вы используете SecurityAction.Demand
, вы должны удалить его.