我正在创建一个具有两种不同授权方案的应用程序:管理员和站点。
如果在策略未成功通过之前尝试访问/admin
路由,则应将用户重定向到拒绝访问页面。此时,用户无法执行任何操作。他们无法访问资源,他们无能为力。
如果您尝试访问/site/joes-super-awesome-site
路由而不遵循政策规定,则应将用户重定向到不同访问被拒绝。此时,用户应该能够请求访问权限。他们可以采取行动。
实现此目标的最佳方法是什么?我知道我可以覆盖默认的OnRedirectToAccessDenied
操作,但这将需要一些难看的字符串解析(下面的未调试示例)。
.AddCookie(options => {
options.Events.OnRedirectToAccessDenied = context => {
// parsing this kinda sucks.
var pathParts = context.Request.Path.Value.Split('/', StringSplitOptions.RemoveEmptyEntries);
if (pathParts?[0] == "site") {
context.Response.Redirect($"/{pathParts[0]}/request-access");
} else {
context.Response.Redirect("/account/access-denied");
}
return Task.CompletedTask;
};
})
答案 0 :(得分:1)
进行搜索后,发现以下信息:
不幸的是,这些改进并未适用于ASP.NET Core 2.1。
目前看来,另一种选择(除了您建议解析请求URL的建议)是强制性地在MVC操作中调用授权服务。
它可能来自:
// Highly imaginary current implementation
public class ImaginaryController : Controller
{
[HttpGet("site/{siteName}")]
[Authorize("SitePolicy")]
public IActionResult Site(string siteName)
{
return View();
}
[HttpGet("admin")]
[Authorize("AdminPolicy")]
public IActionResult Admin()
{
return View();
}
}
收件人:
public class ImaginaryController : Controller
{
private readonly IAuthorizationService _authorization;
public ImaginaryController(IAuthorizationService authorization)
{
_authorization = authorization;
}
[HttpGet("site/{siteName}")]
public Task<IActionResult> Site(string siteName)
{
var sitePolicyAuthorizationResult = await _authorization.AuthorizeAsync(User, "SitePolicy");
if (!sitePolicyAuthorizationResult.Success)
{
return Redirect($"/site/{siteName}/request-access");
}
return View();
}
[HttpGet("admin")]
public Task<IActionResult> Admin()
{
var adminPolicyAuthorizationResult = await _authorization.AuthorizeAsync(User, "AdminPolicy");
if (!adminPolicyAuthorizationResult.Success)
{
return Redirect("/account/access-denied");
}
return View();
}
}