2015-02-10 2 views
3

Я готовлю приложение в ASP.NET MVC 6. Это приложение имеет папку с некоторыми статическими файлами для целей администрирования. Я хотел бы ограничить доступ к этому контенту пользователям с определенной ролью.Администрирование папки ASP.NET MVC 6

Перед MVC 6 появилась возможность создать файл web.config и поместить его в эту ограниченную папку (пример: asp.net folder authorization).

Аналогичный подход доступен в vNext?

+0

'Перед тем, как MVC 6 появилась возможность создать файл web.config и поместить его в эту ограниченную папку' вы пробовали именно это? Это должно по-прежнему работать (возможно, вам нужно включить «статические файлы маршрута через ASP.NET») ... – ChrFin

+3

Всегда проще попробовать, прежде чем отправлять вопрос о переполнении стека. Сохраняет смущение. – BenjaminPaul

+1

Не правда ли, что web.config устарел в vNext? В мастере «Добавить новый элемент» такого шаблона нет. – azachert

ответ

2

Вы можете следить за Scott Allen's блог, который показывает, как сделать это с помощью какого-то промежуточного программного обеспечения:

// First, in the Startup class for the application, we will add the required services. 
public void ConfigureServices(IServiceCollection services) 
{ 
    services.AddAuthentication(); 
    services.AddAuthorization(options => 
    { 
     options.AddPolicy("Authenticated", policy => policy.RequireAuthenticatedUser()); 
    }); 
} 

ProtectFolder класса самого промежуточного слоя. Метод Invoke на объекте промежуточного ПО можно вводить, поэтому мы будем запрашивать текущую службу авторизации и использовать службу для авторизации пользователя, если текущий запрос направляется в защищенную папку. Если авторизация не удалась, мы используем диспетчер проверки подлинности для запроса пользователя, который обычно перенаправляет браузер на страницу входа в систему в зависимости от параметров проверки подлинности приложения.

public class ProtectFolderOptions 
{ 
    public PathString Path { get; set; } 
    public string PolicyName { get; set; } 
} 

public static class ProtectFolderExtensions 
{ 
    public static IApplicationBuilder UseProtectFolder(
     this IApplicationBuilder builder, 
     ProtectFolderOptions options) 
    { 
     return builder.UseMiddleware<ProtectFolder>(options); 
    } 
} 

public class ProtectFolder 
{ 
    private readonly RequestDelegate _next; 
    private readonly PathString _path; 
    private readonly string _policyName; 

    public ProtectFolder(RequestDelegate next, ProtectFolderOptions options) 
    { 
     _next = next; 
     _path = options.Path; 
     _policyName = options.PolicyName; 
    } 

    public async Task Invoke(HttpContext httpContext, 
          IAuthorizationService authorizationService) 
    { 
     if(httpContext.Request.Path.StartsWithSegments(_path)) 
     { 
      var authorized = await authorizationService.AuthorizeAsync(
           httpContext.User, null, _policyName); 
      if (!authorized) 
      { 
       await httpContext.Authentication.ChallengeAsync(); 
       return; 
      } 
     } 

     await _next(httpContext); 
    } 
} 

Назад в классе запуска приложения, мы настроим новое промежуточное программное обеспечение для защиты/секретный каталог с «Зарегистрированным» политики.

public void Configure(IApplicationBuilder app) 
{ 
    app.UseCookieAuthentication(options => 
    { 
     options.AutomaticAuthentication = true; 
    }); 

    // This must be before UseStaticFiles. 
    app.UseProtectFolder(new ProtectFolderOptions 
    { 
     Path = "/Secret", 
     PolicyName = "Authenticated" 
    }); 

    app.UseStaticFiles(); 

    // ... more middleware 
} 
2

Если вы размещаете его в IIS, вы все равно можете установить защиту в папке таким же образом.

Смежные вопросы