在 ASP.NET-Core 2.2 中检索给定类型的声明集合
Retrieve claims collection of a given type in ASP.NET-Core 2.2
我已经实施了一个系统,允许用户访问给定的 url 只是他在 his/her 声明中拥有 url。我创建了类型为 "UserRoutes" 的声明并添加了用户可用的 URL。因此,当用户登录到应用程序时,he/she 只能访问类型为 "UserRoutes".
的 his/her 声明中的那些 URL
现在我正在寻找一种方法来获取视图中的 his/her URL 集合,以决定是否将 link 显示给给定的 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' does not contain a definition for 'Contains' and the best extension method overload 'ParallelEnumerable.Contains(ParallelQuery, string)' requires a receiver of type 'ParallelQuery
请问我怎样才能做到这一点。感谢您的努力
试试这个:
@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"
替换为您要比较的元素。
您可以使用Enumerable.Any()
扩展方法
@if (User.FindAll("UserRoutes").Any(claim => claim.Value == "courses/create"))
{
...
}
您应该使用 HasClaim
方法,您可以在其中传递声明类型和价值
User.HasClaim("UserRoutes", "courses/create")
您收到该错误消息是因为您需要对 System.Linq
的引用,因为那是 IEnumerable<T>.Contains<T>(T source)
所在的位置。如果你真的想要在视图中有你的逻辑,你应该在视图的顶部添加@using System.Linq
(或放在_ViewImports.cshtml
文件中)。
但是
你真的应该将这种逻辑发送到 Controller
/ PageModel
而不是将其放在视图渲染上!
假设您正在使用 RazorPages
和一个名为 MyPage
的 RazorPage
在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>
}
...
我已经实施了一个系统,允许用户访问给定的 url 只是他在 his/her 声明中拥有 url。我创建了类型为 "UserRoutes" 的声明并添加了用户可用的 URL。因此,当用户登录到应用程序时,he/she 只能访问类型为 "UserRoutes".
的 his/her 声明中的那些 URL现在我正在寻找一种方法来获取视图中的 his/her URL 集合,以决定是否将 link 显示给给定的 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' does not contain a definition for 'Contains' and the best extension method overload 'ParallelEnumerable.Contains(ParallelQuery, string)' requires a receiver of type 'ParallelQuery
请问我怎样才能做到这一点。感谢您的努力
试试这个:
@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"
替换为您要比较的元素。
您可以使用Enumerable.Any()
扩展方法
@if (User.FindAll("UserRoutes").Any(claim => claim.Value == "courses/create"))
{
...
}
您应该使用 HasClaim
方法,您可以在其中传递声明类型和价值
User.HasClaim("UserRoutes", "courses/create")
您收到该错误消息是因为您需要对 System.Linq
的引用,因为那是 IEnumerable<T>.Contains<T>(T source)
所在的位置。如果你真的想要在视图中有你的逻辑,你应该在视图的顶部添加@using System.Linq
(或放在_ViewImports.cshtml
文件中)。
但是
你真的应该将这种逻辑发送到 Controller
/ PageModel
而不是将其放在视图渲染上!
假设您正在使用 RazorPages
和一个名为 MyPage
RazorPage
在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>
}
...