Реклама:

protected void Page_Load(object sender, EventArgs e) i

if (Request.ClientCertificate.IsPresent i& Request.ClientCertificate.IsVaiid)

I

JMSubject.Text = Request. ClientCertificate. Subject;

I

i

Класс НирСНеп1СеШ/кМе имеет лишь ограниченную функциональность, однако вы можете включить объект клиентского сертификата в Х509СеПг/ка1е2, что даст вам все преимущества реализации РКС5, описанной в главе 4 (в частности, это позволит шифровать данные с помощью открытого ключа пользователя).

Следующий обработчик шифрует файлы с помощью клиентского сертификата и загружает их на машину клиента.

Обработчик ЕпсгурМпдОонп1оао'

<*9 1/<еЬНап01ег 1апдиаде="С«" Паев-'Епсгур^лд0оип1оа0На^1ег" *>

using System; using System.10; using System.Web;

using System.Security.Cryptography.Pkcs:

using System.Security.Cryptography.X509Certificates;

public class EncryptingDownloadHandler : IHttpHandler

private const st'ing DOWNLOADPATH = ""/Download/":

public void ProceSSReguest (HttpContext context) i

II Проверка наличия и действительности сертификата if (!centext.Request.ClientCertificate.isPresent || !context.Request.CliertCertificate.IsValid)

t"row new ArgymentException("No valid cert supplied"): // Проверка наличия переменной строки запроса FileName if (string.IsNullOrEmpty(

context. Request. Que rySt nng[" Fi leName" ])) throw new ArgumentException("FileName parameter missing"):

byte[] bytes;

string fileName = context.Request.Q'jeryString["FileName"];

// Подтверждение имени файла; обслуживаются только

// файлы из палки Download

if (validateFileName(ref fileName))

{

// Шифрование и подписывание файла bytes = encryptAndSignFlle(fileName, context.Request,ClientCertificate);

// Отображение диалогового окна загрузки context.Response.AddHeader(

"Content-Type", "binary/octet-stream"); context.Response.AddHeader("Content-Length",

bytes.Length.ToStrlng()); context.Response.AddHeaoer( "Content-Disposition", string.Format( "attachment; filename=<0); slze={l>", fileName + ".secure", bytes, Length.ToStringO)): context.Response.Binarywrjte(bytes);

else

throw new ArgumentException("File not found");

)

// Убеждаемся, что мы закрыты для атак с вложением путей // Обслуживается только файлы из назначенной папки Download private bool validateFileName(re' string fileName) {

HttpContext context = HttpContext.Current;

// Нормализация имени файла

fileName = Path.GetFileName(<-ileName):

return (File.Ex ists(context.Server.MapPath( DOWNLOADPATH + fileName)));

)

private byte[] encryptAndSignFile(string fileName, HttpClientCertificate clientCert)

{

HttpContext context = HttpContext.Current;

// Извлечение сертификата клиента и преобразование // в X509Certificate2 X509Certificate2 cert = new

X509Certificate2(clientCert.Certificate); // Считывание файла byte[] file; using (BinaryReader reader = new BinaryReader( new FileStream(context.Server.MapPath( DOVMLOADPATH + fileName),

FiieMode.Open, FiieAccess.Read. FiieSnare.Read)))


⇐ Предыдущая страница| |Следующая страница ⇒