Невозможно передать файл на S3 из ASP.Net Core Web API.Продолжайте получать «Отказано в доступе» - PullRequest
0 голосов
/ 05 апреля 2019

Я уже некоторое время пытаюсь понять это и просто не могу заставить его работать. Я работаю над веб-приложением, в котором у меня будет пользователь, которому нужно загружать файлы в корзину S3, а затем другие пользователи смогут просматривать этот контент из корзины. Я пытался заставить загрузку ведра работать безрезультатно. Вот политики, которые я установил в IAM и S3 для моего приложения / корзины:

Ковш:

{
    "Version": "2012-10-17",
    "Id": "Policy1488494182833",
    "Statement": [
        {
            "Sid": "Stmt1488493308547",
            "Effect": "Allow",
            "Principal": {
                "AWS": "arn:aws:iam::614222560511:user/NuRenAppUser"
            },
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::nu-ren-bucket",
                "arn:aws:s3:::nu-ren-bucket/*"
            ]
        }
    ]
}

Пользователь IAM:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "FullAccessS3",
            "Effect": "Allow",
            "Action": "s3:*",
            "Resource": [
                "arn:aws:s3:::nu-ren-bucket"
            ]
        }
    ]
}

У меня есть мои учетные данные в папке .aws, и клиент S3 прекрасно их подхватывает. Единственная проблема с учетными данными, в которых я не уверен, это то, что при отладке есть поле, которое говорит, что «токен» не заполняется, но большая часть документации, которую я видел, просто инструктирует ввести два ключа и регион , который я установил правильно. Вот мой код:

ASP.Net Core 2.1 Web Api:

using Amazon.Runtime;
using Amazon.S3;
using Amazon.S3.Transfer;
using Amazon.S3.Model;
using Microsoft.AspNetCore.Http;
using NuRen.Services.Abstractions;
using NuRen.Services.Models;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;
using System.Threading.Tasks;

namespace NuRen.Services.Repositories
{
    public class VideoRepository : IVideoRepository
    {
        private IAmazonS3 _s3Client;

        public VideoRepository(IAmazonS3 s3Client)
        {
            _s3Client = s3Client;
        }

        public async Task<Guid> SaveVideo(IFormFile file, Video newVideo)
        {
            Stream fileStream = file.OpenReadStream();
            var request = new PutObjectRequest();
            request.BucketName = "nu-ren-bucket";
            request.Key = newVideo.ID.ToString();
            request.InputStream = fileStream;
            request.ContentType = file.ContentType;
            request.CannedACL = S3CannedACL.PublicRead;
            var response = await _s3Client.PutObjectAsync(request);
            //var uploadrequest = new TransferUtilityUploadRequest()
            //{
            //    InputStream = fileStream,
            //    Key = newVideo.ID.ToString(),
            //    BucketName = "nu-ren-bucket",
            //    CannedACL = S3CannedACL.PublicRead
            //};
            return newVideo.ID;
        }
    }
}

Я знаю, что моя модель говорит видео, но я только что тестировал маленькие файлы, чтобы заставить его работать, поэтому я знаю, что размер не проблема. Код, который вы прокомментировали, - это то, что я пробовал раньше всего, и я продолжаю получать ту же проблему:

Ошибка:

An unhandled exception occurred while processing the request.
HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.
Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken cancellationToken) in HttpRequestMessageFactory.cs, line 539

AmazonS3Exception: Access Denied
Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in HttpErrorResponseExceptionHandler.cs, line 60

Stack Query Cookies Headers
HttpErrorResponseException: Exception of type 'Amazon.Runtime.Internal.HttpErrorResponseException' was thrown.
Amazon.Runtime.HttpWebRequestMessage.GetResponseAsync(CancellationToken cancellationToken) in HttpRequestMessageFactory.cs
Amazon.Runtime.Internal.HttpHandler<TRequestContent>.InvokeAsync<T>(IExecutionContext executionContext) in HttpHandler.cs
Amazon.Runtime.Internal.RedirectHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.Unmarshaller.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.S3.Internal.AmazonS3ResponseHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.ErrorHandler.InvokeAsync<T>(IExecutionContext executionContext)

Show raw exception details
AmazonS3Exception: Access Denied
Amazon.Runtime.Internal.HttpErrorResponseExceptionHandler.HandleException(IExecutionContext executionContext, HttpErrorResponseException exception) in HttpErrorResponseExceptionHandler.cs
Amazon.Runtime.Internal.ErrorHandler.ProcessException(IExecutionContext executionContext, Exception exception) in ErrorHandler.cs
Amazon.Runtime.Internal.ErrorHandler.InvokeAsync<T>(IExecutionContext executionContext) in ErrorHandler.cs
Amazon.Runtime.Internal.CallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.EndpointDiscoveryHandler.InvokeAsync<T>(IExecutionContext executionContext) in EndpointDiscoveryHandler.cs
Amazon.Runtime.Internal.CredentialsRetriever.InvokeAsync<T>(IExecutionContext executionContext) in CredentialsRetriever.cs
Amazon.Runtime.Internal.RetryHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.RetryHandler.InvokeAsync<T>(IExecutionContext executionContext) in RetryHandler.cs
Amazon.Runtime.Internal.CallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.CallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.S3.Internal.AmazonS3ExceptionHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.ErrorCallbackHandler.InvokeAsync<T>(IExecutionContext executionContext)
Amazon.Runtime.Internal.MetricsHandler.InvokeAsync<T>(IExecutionContext executionContext)
NuRen.Services.Repositories.VideoRepository.SaveVideo(IFormFile file, Video newVideo) in VideoRepository.cs
+
            var response = await _s3Client.PutObjectAsync(request);
NuRen.Services.Services.VideoService.UploadVideo(IFormFile file) in VideoService.cs
+
            return await _vr.SaveVideo(file, newVideo);
NuRenApp.Controllers.VideoController.UploadVideo(IFormFile file) in VideoController.cs
+
           return await _vs.UploadVideo(file);
lambda_method(Closure , object )
Microsoft.Extensions.Internal.ObjectMethodExecutorAwaitable+Awaiter.GetResult()
Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor+AwaitableObjectResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, object controller, object[] arguments)
System.Threading.Tasks.ValueTask<TResult>.get_Result()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeNextActionFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Rethrow(ActionExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeInnerFilterAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeNextResourceFilter()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Rethrow(ResourceExecutedContext context)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.Next(ref State next, ref Scope scope, ref object state, ref bool isCompleted)
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeFilterPipelineAsync()
Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.InvokeAsync()
Microsoft.AspNetCore.Builder.RouterMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.StaticFiles.StaticFileMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.MigrationsEndPointMiddleware.Invoke(HttpContext context)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore.DatabaseErrorPageMiddleware.Invoke(HttpContext httpContext)
Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context)

Я пробовал разные комбинации кода, политик и ключей, но ничего не помогло. Полностью застрял в этой точке.

...