多个访问被拒绝的页面



我正在创建一个具有两种不同授权场景的应用程序:admin和site。

如果尝试在策略未成功的情况下访问/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;
};
})

通过搜索,我发现了以下信息:

  • 有人对此GitHub问题有同样的问题
  • 跟踪此GitHub问题中与授权相关的改进

不幸的是,这些改进并没有达到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();
}
}

相关内容

  • 没有找到相关文章

最新更新