ASP.NET MVC 6 文件夹授权
ASP.NET MVC 6 folder authorization
我正在 ASP.NET MVC 6 中准备应用程序。此应用程序有一个文件夹,其中包含一些用于管理目的的静态文件。我想限制具有特定角色的用户访问此内容。
在 MVC 6 之前,可以创建一个 web.config 文件并将其放在这个受限文件夹中(例如:asp.net folder authorization)。
vNext 中是否有类似的方法?
如果您在 IIS 中托管它,您仍然可以以相同的方式设置文件夹的安全性。
您可以关注 Scott Allen's 博客 post,其中显示了如何使用一些中间件执行此操作:
// 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
class 是中间件本身。中间件对象上的 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);
}
}
回到应用程序的启动 class,我们将配置新的中间件以使用“已验证”策略保护 /secret 目录。
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
}
我正在 ASP.NET MVC 6 中准备应用程序。此应用程序有一个文件夹,其中包含一些用于管理目的的静态文件。我想限制具有特定角色的用户访问此内容。
在 MVC 6 之前,可以创建一个 web.config 文件并将其放在这个受限文件夹中(例如:asp.net folder authorization)。
vNext 中是否有类似的方法?
如果您在 IIS 中托管它,您仍然可以以相同的方式设置文件夹的安全性。
您可以关注 Scott Allen's 博客 post,其中显示了如何使用一些中间件执行此操作:
// 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
class 是中间件本身。中间件对象上的 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);
}
}
回到应用程序的启动 class,我们将配置新的中间件以使用“已验证”策略保护 /secret 目录。
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
}