首页 > 解决方案 > Razor Pages 发现和授权

问题描述

我正在使用 ASP.NET Core 3.0 和 Razor Pages 开发一个 Web 应用程序。我想添加一个功能,允许用户按页面名称搜索 - 假设用户搜索“密码”,结果是“更改密码”,这是一个 Razor 页面。

我想页面模型看起来像:

[SearchablePage(Name="Manage Account", Keywords="password,username,change")]
public class ManageAccountModel : PageModel
{
   ...
}

到目前为止,我设法通过注入IActionDescriptorCollectionProvider和查找PageActionDescriptor项目来进行页面发现。这将显示应用程序中的所有页面。

我不确定如何访问每个页面的实际PageModel,以便确定自定义搜索属性的值。

我还试图弄清楚用户是否有权查看页面 - 是来自授权属性还是来自 Startup.cs 中配置的授权约定。

任何帮助或在哪里寻找的指针将不胜感激!

谢谢!

更新

我设法IAuthorizationService从框架文档中找到了一个提供。现在的诀窍是检索剃须刀页面的所有策略。

标签: c#razor-pagesasp.net-core-3.0

解决方案


我有以下页面列出了我的 webapp 中的所有路由。我用来诊断端点。作为起点可能有用。我不确定您将如何获得授权信息。

public class RoutesModel : PageModel {
    private readonly IActionDescriptorCollectionProvider _actionDescriptorCollectionProvider;

    public RoutesModel(IActionDescriptorCollectionProvider actionDescriptorCollectionProvider) {
        this._actionDescriptorCollectionProvider = actionDescriptorCollectionProvider;
    }

    public List<RouteInfo> Routes { get; set; }

    public void OnGet() {
        Routes = _actionDescriptorCollectionProvider.ActionDescriptors.Items
                .Select(x => new RouteInfo {
                    Action = x.RouteValues["Action"],
                    Controller = x.RouteValues["Controller"],
                    Name = x.AttributeRouteInfo?.Name,
                    Template = x.AttributeRouteInfo?.Template,
                    Constraint = x.ActionConstraints == null ? "" : JsonConvert.SerializeObject(x.ActionConstraints)
                })
            .OrderBy(r => r.Template)
            .ToList();
    }

    public class RouteInfo {
        public string Template { get; set; }
        public string Name { get; set; }
        public string Controller { get; set; }
        public string Action { get; set; }
        public string Constraint { get; set; }
    }
}

推荐阅读