Pergunta

Alguém sabe de uma boa prática de fixação de mídia para asp.net?

Eu preciso para hospedar uma variedade de meios de comunicação que requerem permissão para uma vista específica de uma imagem/vídeo.i.e.um usuário específico pode ou não ter permissão para visualizar um arquivo de mídia, e este fato pode ser alterada.

Eu não me importo se eles podem baixar um arquivo de mídia a que têm acesso, eu só não quero que eles mesmo estar ciente de itens que não devem ter acesso.

Eu já considerado url ofuscação - isso parece bastante lame a mim.

Eu tenho formulário usuários autenticados (e eu não estou disposta a mudar isso).

Eu gostaria de manter a estrutura de pasta de arquivo de mídia não relacionados a permissões.

Foi útil?

Solução

Construa um httphandler que toda a mídia deve ser acessada. Depois, antes de recuperar o arquivo e enviá -lo ao usuário, você pode executar qualquer validações que desejar. Mantenha toda a sua mídia fora do caminho principal da Wwwroot ou negue acesso a essa pasta usando permissões.

Mais informações sobre este tópico aqui:

http://www.15seconds.com/issue/020417.htm

Outras dicas

Eu uso um arquivo xml como este para definir quais usuários/grupos que terão acesso a um arquivo

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE root[
    <!ELEMENT file ANY>
    <!ATTLIST file name ID #REQUIRED>
]>
<root>
    <file name="file.doc" users="155,321" groups="grp5" />
    <file name="file2.doc" users="321" groups="" />
</root>

os arquivos são armazenados acima http raiz, de modo que eles não podem ser acessados pela URL.

Quando um usuário tenta acessar GetFile.aspx?file=file.doc eu carregar o XML, começar a linha com

XmlNode xnFile= XML.GetElementById(wantedFile);

, então eu chamar uma função

 HasAccess(Context.User, xnFile); 

Que verifica se o usuário está conectado e compara as permissões, e se é ok para que este usuário tenha o arquivo, eu ler os arquivos do disco e gravá-los com

FileInfo thisFile = new FileInfo(secretLocation + wantedFile);
Response.Clear();
Response.Buffer = false;
Response.BufferOutput = false;
Response.ClearContent();
Response.ClearHeaders();
Response.AddHeader("Content-Length", thisFile.Length.ToString());
Response.AddHeader("Content-disposition", "filename=" + thisFile.Name);
Response.ContentType = "application/none";
Response.WriteFile(secretLocation + wantedFile);
Response.Close();
Response.End();
Response.ClearContent();
Response.ClearHeaders();

Na verdade, agora eu tenho mais de mil arquivos, e penso em escrever o ficheiro de dados para o banco de dados como o XML foi corrompido duas vezes em 5 anos, provavelmente devido a quedas ou uso simultâneo.

Do seu comentário na resposta Spikolynn

Estou intrigado - como isso é diferente da ofuscação? Um usuário autenticado seria capaz de compartilhar uma imagem (para a qual eles são autorizados) com outro usuário autenticado, mas não autorizado?

Eu acho que você tenta Evite não autorizado compartilhamento de mídia.

Isso é algo que muitas empresas (Microsoft, Apple, IBM etc.) colocaram uma quantia considerável de dinheiro para resolver. A solução foi DRM, e agora eles estão removendo, porque falhou.

Então, minha resposta é que você não pode evitar o compartilhamento Se o usuário estiver disposto a fazer algum esforço para evitá -lo.

Você pode apenas Mantenha as pessoas honestas honestas aplicando algumas técnicas como Spikolynn ou Lusid Explique em suas respostas.

Eu sugiro uma tabela contendo os arquivos que cada usuário tem acesso:

UserID int
FileID varchar

em seguida, uma tabela para os seus ficheiros:

FileID    UniqueIdentifier
FileType  char(4)  <- so you know which extension to use.
etc...

Na unidade de disco rígido, o nome do arquivo a FileID (UniqueIdentifier) e o Tipo de arquivo (extensão, por exemplo..jpg).O fileID na tabela de permissões vai conter o identificador exclusivo gerado na outra tabela.

Você pode passar por este através da URL conhecer com relativa segurança que o usuário não será capaz de adivinhar o nome de qualquer outro arquivo.

Atualização:este é, a propósito, muito mais simples do que escrever um HttpHandler ou lidar com as permissões do arquivo.No entanto, enquanto as chances de alguém adivinhar outro nome de arquivo são infinitesimal não é hermético de segurança como um usuário pode dar a outro o acesso ao arquivo.

Brownpaperpackage.aspx? id = {guid}

No evento de carga de media.aspx, você verifica que o usuário é autenticado e verifique se o usuário tem o direito de visualizar a mídia e, se o fizer, carregue a mídia como um fluxo e alimenta -a com a resposta da página como Spikolynn demonstrado.

Por que fazer dessa maneira? É simples de codificar e você obtém todos os benefícios dos serviços de autenticação ASP.NET e IIS, dos quais você pode encontrar o usuário solicitando a mídia. É trivial mapear esse usuário para uma lista de acesso para seus objetos de mídia. E a página tem o objeto de solicitação ali mesmo. Você também está escondendo o nome da mídia, para que não possa dizer o que está acontecendo no URL.

Como você evita que as pessoas acessem sua mídia diretamente? Seus arquivos de mídia não podem ser armazenados no diretório virtual do IIS. Se forem, existe a possibilidade de que eles possam ser baixados diretamente. Você pode armazená -los em um banco de dados como uma matriz de bytes (BLOB) ou armazená -los no disco fora do diretório virtual da Web. Os usuários devem passar pelo ASP.NET para acessar os arquivos

Como você acompanha o que os usuários têm acesso a qual mídia? Você acompanha seus usuários, com associação ASP.NET. Isso significa que cada usuário tem um ID na tabela ASPNET_USERS. Crie uma tabela para sua mídia com um ID e um nome de arquivo (ou uma blob contendo a mídia real). Então você só precisa criar uma terceira tabela que conecte os dois. Esta tabela conteria um ID de usuário e um ID de mídia, significando que esse usuário pode visualizar essa mídia. Com o ID do usuário (da associação do ASP.NET) e o ID da mídia (do URL), você só precisa

select count(*) from UserMedia where UserId = @UserGuid and MediaId = @MediaIdFromUrl

e se a contagem> 0 o usuário puder visualizar a mídia.

Um exemplo de como você usaria o URL:

<asp:image 
  runat="server" 
  ImageUrl="brownpaperpackage.aspx?id=53a2ea4(snip)76ca8b" />
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top