在 .net 核心视图自定义访问拒绝视图中实施策略
Implement policies in .net core view custom Access Denied views
我正在构建一个应用程序,我试图在其中使用策略来控制我的用户访问。
如果他们已经创建了帐户,则需要获得管理员的批准。所以他们会在第一次登录时通过我的自定义 AccessDenied.cshtml 视图来满足。这部分效果很好:
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder().
RequireAuthenticatedUser().
RequireRole("AuthenticatedUser").
Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new RequireHttpsAttribute());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
现在我需要另一个过滤器,它检查一组不同的角色,returns 另一个定制的 "AccessDenied" 视图。
这有可能吗?我知道我可以插入另一个 RequireRole("role"),但随后他们将遇到相同的访问被拒绝页面。
在经历了几次死胡同后,我终于找到了一个可以接受的解决方法。
它采取了几个步骤,但如果其他人需要这个,我将记录我所做的:
1.
在启动文件中将这两个角色添加到您的策略中,并在您的 .Addmvc 调用上方添加一个自定义路径以拒绝访问:
services.PostConfigure<CookieAuthenticationOptions>(IdentityConstants.ApplicationScheme,
opt =>
{
opt.AccessDeniedPath = $"/Home/AccessDeniedCustom";
});
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder().
RequireAuthenticatedUser().
RequireRole("AuthenticatedUser").
RequireRole("Your2ndRole").
Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new RequireHttpsAttribute());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
- 现在,如果我们任一个角色,我们将获得我们的自定义访问被拒绝视图,但这两个角色仍然只有 1 个访问被拒绝页面。
我们将转到 AccessDeniedCustom 视图,并使用 Razor 语法呈现视图。基本上我在视图文件中有两个完整的视图,我使用以下内容来决定渲染哪个:
@{
ViewData["Title"] = "AccessDeniedCustom";
var user = Context.User;
}
@if (!user.IsInRole("AuthenticatedUser")){ //Show some html }
else{ //show some different html}
确保在您的新自定义“拒绝访问”视图上放置一个 [AllowAnonymous],否则您将走不远。
我正在构建一个应用程序,我试图在其中使用策略来控制我的用户访问。
如果他们已经创建了帐户,则需要获得管理员的批准。所以他们会在第一次登录时通过我的自定义 AccessDenied.cshtml 视图来满足。这部分效果很好:
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder().
RequireAuthenticatedUser().
RequireRole("AuthenticatedUser").
Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new RequireHttpsAttribute());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
现在我需要另一个过滤器,它检查一组不同的角色,returns 另一个定制的 "AccessDenied" 视图。
这有可能吗?我知道我可以插入另一个 RequireRole("role"),但随后他们将遇到相同的访问被拒绝页面。
在经历了几次死胡同后,我终于找到了一个可以接受的解决方法。 它采取了几个步骤,但如果其他人需要这个,我将记录我所做的:
1.
在启动文件中将这两个角色添加到您的策略中,并在您的 .Addmvc 调用上方添加一个自定义路径以拒绝访问:
services.PostConfigure<CookieAuthenticationOptions>(IdentityConstants.ApplicationScheme,
opt =>
{
opt.AccessDeniedPath = $"/Home/AccessDeniedCustom";
});
services.AddMvc(options =>
{
var policy = new AuthorizationPolicyBuilder().
RequireAuthenticatedUser().
RequireRole("AuthenticatedUser").
RequireRole("Your2ndRole").
Build();
options.Filters.Add(new AuthorizeFilter(policy));
options.Filters.Add(new RequireHttpsAttribute());
}).SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
- 现在,如果我们任一个角色,我们将获得我们的自定义访问被拒绝视图,但这两个角色仍然只有 1 个访问被拒绝页面。
我们将转到 AccessDeniedCustom 视图,并使用 Razor 语法呈现视图。基本上我在视图文件中有两个完整的视图,我使用以下内容来决定渲染哪个:
@{
ViewData["Title"] = "AccessDeniedCustom";
var user = Context.User;
}
@if (!user.IsInRole("AuthenticatedUser")){ //Show some html }
else{ //show some different html}
确保在您的新自定义“拒绝访问”视图上放置一个 [AllowAnonymous],否则您将走不远。