代码之家  ›  专栏  ›  技术社区  ›  Josh

在ASP中检索给定类型的索赔集合。净核心2.2

  •  0
  • Josh  · 技术社区  · 5 年前

    我已经实现了一个系统,允许用户访问给定的url,前提是他/她的声明中只有该url。我创建了一个类型为“UserRoutes”的声明,并添加了用户可用的URL。因此,当用户登录到应用程序时,他/她只能访问他/她声明类型为“UserRoutes”的那些URL。

    现在,我正在寻找一种获取他/她的url集合的方法,以决定是否显示指向给定url的链接。

    试试这个

      @if (User.FindAll("UserRoutes").Contains("courses/create"))
        {
        <p>
            <a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
        </p>
         }
    

    还是这个

    var userRoutes = User.Claims.Where(c => c.Type == "UserRoutes");
    if (userRoutes.Contains("courses/create")){
    <p>
            <a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
        </p>
    

    显示以下错误

    IEnumerable不包含Contains和best extension method重载ParallelEnumerable的定义。Contains(ParallelQuery,string)'需要'ParallelQuery'类型的接收器

    请问我怎样才能做到这一点。我感谢你的努力

    0 回复  |  直到 5 年前
        1
  •  1
  •   Kahbazi    5 年前

    你应该使用 HasClaim 方法,在该方法中可以传递索赔类型和索赔值

    User.HasClaim("UserRoutes", "courses/create")
    
        2
  •  1
  •   Ivan García Topete    5 年前

    您收到该错误消息是因为您需要对 System.Linq 因为那就是 IEnumerable<T>.Contains<T>(T source) 位于。如果你 真正地 想要在视图中显示逻辑,您应该添加 @using System.Linq 在视图的顶部(或放在 _ViewImports.cshtml 文件)。

    但是

    你真的应该把这种逻辑传达给 Controller / PageModel 而不是把它放在视图渲染上!

    假设你正在使用 RazorPages 用一个 RazorPage 命名的 MyPage

    在里面 MyPage.cshtml.cs :

    using System;
    using System.Collections.Generic;
    /* this is the key */
    using System.Linq;
    using Microsoft.AspNetCore.Mvc.RazorPages;
    
    namespace MyWebApp
    {
        public class MyPageModel : PageModel
        {
            [BindProperty(SupportsGet = true)]
            public bool CreateCourses { get; set; }
    
            public void OnGet()
            {
                /* set the property to use on the page */
                this.CreateCourses = User.FindAll("UserRoutes")
                    .Any(claim => claim.Value == "courses/create")
            }
        }
    }
    

    然后在 MyPage.cshtml :

    ...
    @if (Model.CreateCourses)
    {
        <p>
            <a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
        </p>
    }
    ...
    
        3
  •  0
  •   Guilherme Martin    5 年前

    试试这个:

     @if (User.Where(p => p.YOURPARAMETER == "UserRoutes").ToList().Contains("courses/create"))
        {
        <p>
            <a asp-action="Create" class="btn btn-primary my-3"><span class="fa fa-plus-circle"></span> New Course</a>
        </p>
         }
    

    记得更换 "YOURPARAMETER" 要比较的元素。

        4
  •  0
  •   alexm    5 年前

    你可以用 Enumerable.Any() 可拓方法

     @if (User.FindAll("UserRoutes").Any(claim => claim.Value == "courses/create"))
    {
            ...
     }