Как обезопасить ссылку для скачивания только конкретными пользователями? - PullRequest
5 голосов
/ 02 апреля 2012

У меня следующий случай, и я хочу спросить, какое решение лучше?

У меня есть определенный файл, я хочу, чтобы определенные пользователи (в соответствии с некоторыми разрешениями) загружали этот файл.

поэтому я показываю этот файл только для авторизованных пользователей, но что, если кто-то (не авторизованный) распознает ссылку на файл (знает ссылку url) и скачивает ее !!

Как разрешить загрузку этого файла только authorized users.

Ответы [ 4 ]

4 голосов
/ 02 апреля 2012

Мой ответ будет: Не используйте прямые ссылки!

Создайте Download.aspx и разместите ссылки для загрузки на Download.aspx? Params

Параметры должны быть зашифрованы / хешированы с указанием пути к файлу + имя для загрузки и идентификатор_сессии.

На Download.aspx проверьте, что идентификатор_сессии действителен и активен в браузере.

Это позволит вам разрешить загрузку только нужным пользователям:

Если вы добавите в параметры также user_id или user_type, вы можете запретить / разрешить загрузку в onLoad файла Download.aspx

4 голосов
/ 02 апреля 2012

Поместите файл в каталог, который не обслуживается веб-сервером, и реализуйте обработчик для «виртуального URL», который, в свою очередь, проверяет разрешения и т. Д. - возможный способ - обработчик ASHX (см. здесь для примера кода и здесь для ссылки MSDN).

1 голос
/ 02 апреля 2012

Следующая ссылка содержит подробные сведения о правилах авторизации в iis и asp.net, они, похоже, относятся к вашему вопросу.

Во-первых, вы хотите убедиться, что ASP.NET обрабатывает запрос для указанного вами типа файла.Вы можете настроить это в IIS (см. Ссылку ниже).

Во-вторых, вам нужно будет обновить ваш web.config, чтобы запретить анонимным пользователям доступ к вашему URL, при условии, что вы используете rolemanager:

 <roleManager defaultProvider="SqlProvider" enabled="true" cacheRolesInCookie="false"     
   cookieName=".ASPROLES" cookieTimeout="30" cookiePath="/" cookieRequireSSL="false"  
   cookieSlidingExpiration="true" cookieProtection="All">
  <providers>
    <add name="SqlProvider" type="System.Web.Security.SqlRoleProvider" 
        connectionStringName="membership" applicationName="yourApplication"/>
  </providers>
</roleManager>



<location path="path/file.extension">
      <system.web>
      <authorization>
         <deny users="?"/>
       </authorization>
     </system.web>
   </location>

IIS 6 игнорирует параметры авторизации Web.config

1 голос
/ 02 апреля 2012

Лучшим способом было бы добавить httphandlers и проверить, есть ли у запрошенного файла особые разрешения или нет, примером для того, что я сказал, будет:

        using Microsoft.VisualBasic;
using System;
using System.Collections;
using System.Collections.Generic;
using System.Data;
using System.Diagnostics;

public class MyHTTPHandler : IHttpHandler, IRequiresSessionState
{

string myFile;
public bool IsReusable {
    get { return true; }
}

public void ProcessRequest(System.Web.HttpContext context)
{
    myFile = context.Request.Path;
    if (myFile.ToLower().Contains("members private files") || myFile.ToLower().Contains("members%20private%20files")) {
        if (System.Web.HttpContext.Current.Session["Login"] == null) {
            context.Response.Redirect("~/NotAuthorized.aspx");
        } else {
            if (myFile.ToLower().Contains("privatefiles")) {
                StartDownload(context, myFile);
            } else {
                if (IsMemberAuthoraizedToDownloadFile(context)) {
                    StartDownload(context, myFile);
                } else {
                    context.Response.Redirect("~/NotAuthorized.aspx");
                }
            }
        }
    } else {
        StartDownload(context, myFile);
    }
}

private void StartDownload(HttpContext context, string downloadFile)
{
    context.Response.Buffer = true;
    context.Response.Clear();
    context.Response.AddHeader("content-disposition", "attachment; filename=" + downloadFile);
    context.Response.ContentType = "application/pdf";
    context.Response.WriteFile(downloadFile);
}

// just my own function to check if user is valid

private bool IsMemberAuthoraizedToDownloadFile(HttpContext context)
{
    GroupMembersControl MyGroupMemberc = new GroupMembersControl();
    System.Collections.Generic.List<GroupMembers> MemberGroupsL = MyGroupMemberc.GetMemberGroups(System.Web.HttpContext.Current.Session["Login"]);
    MemberGroupControl MyGroupC = new MemberGroupControl();
    MemberGroup MyGroup = default(MemberGroup);
    foreach (GroupMembers groupmember in MemberGroupsL) {
        MyGroup = MyGroupC.GetMemberGroup(groupmember.GroupID);
        if (myFile.ToLower().Contains(MyGroup.Name.ToLower)) {
            return true;
        }
    }
    return false;
}
    }
...