crosspost: https://orchard.codeplex.com/discussions/471384Возвращение файла в месте с проверкой подлинности
Я использую Orchard CMS 1.7 и мы заперли весь сайт от анонимных пользователей (администратора -> Пользователи -> ролей -> снимите галочку с сайта фронтальными). Теперь, каждая страница или файл требует, чтобы люди были аутентифицированы, прежде чем получать к ним доступ.
Теперь мы пытаемся предоставить возможность загрузки некоторых файлов для загрузки в зависимости от поля из определенного типа содержимого.
Этот вопрос
При загрузке файла в то время как я проверку подлинности, я получаю без проблем. Если я анонимный, я получаю файл (правильное имя и тип файла), но у него нет содержимого и размера (0 байтов). Я уверен, что это проблема auth, так как все работает хорошо, когда я разрешаю анонимный доступ к сайту.
Это фактический код возврата файла (redirectLink является путь_к_файлом):
var cd = new System.Net.Mime.ContentDisposition
{
FileName = fileName,
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(HttpUtility.UrlDecode(redirectLink), mimeType);
Вот мой полный код (Действие контроллера):
[AlwaysAccessible]
public ActionResult Download(int resourceId)
{
//set default unsecure value to false
bool isUnsecured = false;
var resourceItem = ContentManager.Get(resourceId);
if (resourceItem == null || resourceItem.ContentType != "Resource")
{
// TODO: log that ID not found??
return new HttpStatusCodeResult(HttpStatusCode.NotFound);
}
var resourcePart = resourceItem.Parts.FirstOrDefault(p => p.PartDefinition.Name == resourceItem.ContentType);
//retrieve unsecure boolean
if (resourcePart != null)
{
var unsecuredField = resourcePart.Fields.FirstOrDefault(f => f.Name == "Unsecured");
if (unsecuredField != null)
{
isUnsecured = unsecuredField.Storage.Get<bool>();
}
}
//check if unsecured resource/allow anonymous downloads
//see Orchard.Security.SecurityFilter - I'm not sure where this is actually used in Orchard though...
if (!isUnsecured && !Services.Authorizer.Authorize(StandardPermissions.AccessFrontEnd, T("Unauthenticated")))
{
return new HttpUnauthorizedResult();
}
if (resourcePart != null)
{
// TODO: Potential concurrency issues?
var downloadCountPart = resourcePart.As<DownloadCountPart>();
if (downloadCountPart != null)
{
downloadCountPart.Total++;
ContentManager.Publish(resourceItem);
}
// Do the redirection/serving of item!
// Prioritize link field over resource field, according to the UI
var linkedField = resourcePart.Fields.FirstOrDefault(f => f.Name == "LinkedFile");
if (linkedField != null)
{
var redirectLink = linkedField.Storage.Get<string>();
if (redirectLink != null)
{
return Redirect(redirectLink);
}
}
var resourceField = resourcePart.Fields.First(f => f.Name == "ResourceFile");
if (resourceField != null)
{
var resourceMPF = (resourceField as MediaLibraryPickerField);
if (resourceMPF != null && resourceMPF.MediaParts != null && resourceMPF.MediaParts.Count() > 0)
{
var fileName = resourceMPF.MediaParts.First().FileName;
var mimeType = resourceMPF.MediaParts.First().MimeType;
var redirectLink = resourceMPF.MediaParts.First().MediaUrl; //to check: first? when are there multiple?
if(!string.IsNullOrWhiteSpace(redirectLink))
{
var cd = new System.Net.Mime.ContentDisposition
{
FileName = fileName,
Inline = false
};
Response.AppendHeader("Content-Disposition", cd.ToString());
return File(HttpUtility.UrlDecode(redirectLink), mimeType);
}
}
}
}
return new HttpStatusCodeResult(HttpStatusCode.NotFound);
}
Что приводит меня к этим вопросам :
- Событие с возвратом Файл, он по-прежнему принимает во внимание текущего пользователя и проверяется ли это лицо?
- Могу ли я использовать олицетворение, чтобы обойти эту проблему?
Любой совет или информация будут высоко оценены. Благодаря!
Работала безупречно, хотя она и не сразу отражалась. Я продолжал удалять cache.dat и другие вещи в App_Data, просто убедитесь. Благодаря! – AnimaSola
Рад слышать :-). – Piedone