【问题标题】:Multiple Access Denied Pages多次访问被拒绝页面
【发布时间】:2019-01-08 11:14:28
【问题描述】:

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

如果您尝试访问 /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;
    };
})

【问题讨论】:

    标签: asp.net-core asp.net-identity asp.net-core-2.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();
        }
    }
    

    【讨论】:

    • 感谢您的回复。我对必须“选择加入”来保护每种方法的想法并不大,但这绝对是一个有趣的想法!
    猜你喜欢
    • 2016-03-14
    • 2011-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-19
    • 2020-02-28
    • 1970-01-01
    相关资源
    最近更新 更多