多路访问被拒绝页面

时间:2018-08-01 00:40:54

标签: asp.net-core asp.net-identity asp.net-core-2.0

我正在创建一个具有两种不同授权方案的应用程序:管理员和站点。

如果在策略未成功通过之前尝试访问/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;
    };
})

1 个答案:

答案 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();
    }
}