我有以下情况,我想问一下什么是最好的解决方案?
我有一个特定的文件我希望特定用户(根据某些权限)下载此文件。
所以我只为授权用户显示此文件,但如果有人(未经授权)识别文件链接(知道链接url
)并下载它,该怎么办?
如何仅允许authorized users
下载此文件。
答案 0 :(得分:4)
将文件放入一个不由Web服务器提供服务的目录中,并实现“虚拟URL”的处理程序,后者又检查权限等。 - 可能的方法是ASHX处理程序(参见{{3}) }用于示例代码,here用于MSDN参考)。
答案 1 :(得分:4)
我的回答是: 不要使用直接链接!
创建一个Download.aspx并将下载链接发布到Download.aspx?params
params应加密/散列,包含要下载的文件路径+名称和session_id。
在Download.aspx上验证session_id在浏览器上是否有效且有效。
这应该允许您仅允许下载到正确的人:
如果您还在params上添加了user_id或user_type,您可以在onLoad of Download.aspx上拒绝/允许下载
答案 2 :(得分:1)
最好的方法是添加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;
}
}
答案 3 :(得分:1)
以下链接提供了有关iis和asp.net中授权规则的详细信息,这似乎与您的问题相关。
首先,您要确保ASP.NET处理指定文件类型的请求。您可以在IIS中配置它(请参阅下面的链接)。
其次,您将需要更新您的web.config以拒绝匿名用户访问您的网址,前提是您正在使用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>