首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在ASP.NET-Core 2.2中检索给定类型的索赔集合

在ASP.NET-Core 2.2中检索给定类型的索赔集合
EN

Stack Overflow用户
提问于 2019-10-03 16:40:01
回答 4查看 706关注 0票数 1

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

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

试试看

代码语言:javascript
复制
  @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>
     }

或者这个

代码语言:javascript
复制
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”的定义,最好的扩展方法重载'ParallelEnumerable.Contains(ParallelQuery,string)’需要一个'ParallelQuery‘类型的接收方。

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2019-10-03 18:06:58

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

代码语言:javascript
复制
User.HasClaim("UserRoutes", "courses/create")
票数 2
EN

Stack Overflow用户

发布于 2019-10-03 21:06:05

您会得到该错误消息,因为您需要对System.Linq的引用,因为这是IEnumerable<T>.Contains<T>(T source)所在的位置。如果确实希望在视图中包含您的逻辑,那么应该在视图的顶部添加@using System.Linq (或者放在_ViewImports.cshtml文件中)。

您应该将这种逻辑发送到Controller / PageModel,而不是将其放在视图呈现上!

假设您使用的是RazorPages和名为MyPageRazorPage

MyPage.cshtml.cs

代码语言:javascript
复制
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

代码语言:javascript
复制
...
@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>
}
...
票数 1
EN

Stack Overflow用户

发布于 2019-10-03 17:00:31

试试这个:

代码语言:javascript
复制
 @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"替换为要比较的元素。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58223501

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档