Как реализовать SecurityPermission на .NET sdk 5?

#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 , вы должны удалить его.