【问题标题】:ASP.NET Core: calling a view component does not respect authorization attributeASP.NET Core:调用视图组件不尊重授权属性
【发布时间】:2017-02-17 12:29:26
【问题描述】:

我实现了 AspNetCore.Authorization 并用[Authorize] 修饰了控制器类。这有效,如果我从浏览器调用控制器。然而,视图组件可以访问数据:

查看:

@foreach (Category category in Model) {
    <a class="btn btn-block
       asp-action="Index"
   asp-controller="Note"
   asp-route-categoryid=@category.CategoryID
   asp-route-page="1">
    @category.Name
</a>

这导致视图组件被来自@category.Name 的数据填充,实际上浏览器的地址栏无法访问。

视图组件:

[Authorize]
public class NavigationMenuViewComponent : ViewComponent
{
    private INoteRepository _Repository;
    public NavigationMenuViewComponent(INoteRepository repository)
    {
        _Repository = repository;
    }
    public IViewComponentResult Invoke()
    {
        ViewBag.SelectedCategory = RouteData?.Values["category"];
        return View(_Repository.Categories
            .OrderBy(x => x.Name));
    }
}

其实我想,Authorize 属性如果没有实际登录,就会拒绝来自视图组件的调用。我怎样才能得到这样的行为?

【问题讨论】:

    标签: c# asp.net-core asp.net-core-viewcomponent


    【解决方案1】:

    ViewComponents 不参与控制器生命周期,这意味着您不能在视图组件中使用过滤器。所以,Authorize 过滤器不会被执行。

    视图组件必须使用 ViewComponent 类公开的 User 属性(获取当前用户的 System.Security.Principal.IPrincipal。)以根据 User 属性的内容做出决策或更改输出。 根据应用程序使用的身份验证类型,您需要验证用户的凭据。

    【讨论】:

    • 谢谢!这给我带来了正确的方向!我使用IHttpContextAccessor context 来访问HttpContext 并分配_User = context.HttpContext.User,这样我就可以检查_User.Identity.IsAuthenticated==true
    • @pisker 你能详细说明你做了什么吗?我面临着完全相同的问题。
    猜你喜欢
    • 2011-07-18
    • 1970-01-01
    • 2018-08-19
    • 2016-01-07
    • 1970-01-01
    • 2021-01-12
    • 2018-10-30
    • 2017-09-16
    • 1970-01-01
    相关资源
    最近更新 更多