我想保护我网页上的图片。
我想显示图像,但用户想要下载或保存图像,图像不应保存到本地硬盘。
我编写了自定义处理程序以限制下载图像的访问权限,但此处理程序也限制了图像的显示。
我的代码是
public class MyFileHandler : IHttpHandler
{
public void ProcessRequest(HttpContext context)
{
context.Response.ContentType = "image/Jpeg";
context.Response.Write("you dont have access");
}
public bool IsReusable
{
get
{
return false;
}
}
}
web.config中的
<configuration>
<system.web>
<compilation debug="true" targetFramework="4.0"/>
<httpHandlers>
<add verb="*" path="*.jpg" validate="true" type="MyFileHandler"/>
</httpHandlers>
</system.web>
</configuration>
是否有任何解决方案可以在网页中显示图像,但不保存或下载图像。
答案 0 :(得分:0)
简而言之,没有。您向客户端浏览器提供的内容位于客户端计算机上,并且可以保存。它可能会保存在缓存中。无论你直接或通过处理程序提供图像,从浏览器的角度来看都是一样的。
如果您不希望某人能够将图像保存到硬盘驱动器,请不要将该图像放在网上。
答案 1 :(得分:0)
我能想到的一件事是为图像分配一个令牌,并让到期值非常短,例如以分钟为单位。例如,在 azure 存储帐户中,可以创建一个私有容器并使用 SAS 令牌在客户端显示图像。但正如其他人所说,没有办法阻止用户下载图片。
[HttpGet("SasExample")]
public async Task<IActionResult> SasExample()
{
string connectionString = "your-container-connection-string";
BlobServiceClient blobServiceClient = new BlobServiceClient(connectionString);
var sourceContainer = blobServiceClient.GetBlobContainerClient("container-name");
await sourceContainer.CreateIfNotExistsAsync();
BlobClient blob = sourceContainer.GetBlobClient("file-name");
var res = GetServiceSasUriForBlob(blob, null);
return Ok(res.AbsoluteUri);
}
private static Uri GetServiceSasUriForBlob(BlobClient blobClient, string storedPolicyName = null)
{
// Check whether this BlobClient object has been authorized with Shared Key.
if (blobClient.CanGenerateSasUri)
{
// Create a SAS token that's valid for one hour.
BlobSasBuilder sasBuilder = new BlobSasBuilder()
{
BlobContainerName = blobClient.GetParentBlobContainerClient().Name,
BlobName = blobClient.Name,
Resource = "b" //b for blob //c for container
};
if (storedPolicyName == null)
{
sasBuilder.ExpiresOn = DateTimeOffset.UtcNow.AddHours(1);
sasBuilder.SetPermissions(BlobSasPermissions.Read |
BlobSasPermissions.Write);
}
else
{
sasBuilder.Identifier = storedPolicyName;
}
Uri sasUri = blobClient.GenerateSasUri(sasBuilder);
Console.WriteLine("SAS URI for blob is: {0}", sasUri);
Console.WriteLine();
return sasUri;
}
else
{
Console.WriteLine(@"BlobClient must be authorized with Shared Key
credentials to create a service SAS.");
return null;
}
}