有没有办法在 Razor 页面的 CSHTML 中的条件内利用 [Authorize] 属性?

Ric*_*ard 3 c# asp.net-authorization asp.net-core razor-pages

我正在开发一个 dotnet core/js 应用程序,其中包括身份验证页面在内的所有前端代码都是使用 JS 框架生成的,其中捆绑的前端被注入到单个 Razor 页面中。前端从控制器 api 端点访问所有 dotnet 核心逻辑。身份验证使用不记名令牌,并且 [Authorize(role='whatever')] 在多个控制器中使用。

由于某种原因,单个 javascript 插件从 razor 页面注入到应用程序中。我基本上需要这个插件在用户经过身份验证之前不可见。这不是“秘密”内容的问题,但该插件在用户经过身份验证之前没有用处。有没有一种简单的方法可以让我查明用户是否在代码的 CSHTML 中与控制器属性一样获得授权?我一直在四处寻找,但没有发现任何有用的东西。不是 C# 或 dotnet core 的专家(主要从事前端工作)并且最简单的解决方案将不胜感激。不知道我是否遗漏了任何相关信息。如果是这样,请告诉我!

pok*_*oke 6

根据您的情况的复杂程度,您可以通过几种方法来授权用户。

如果您只想验证用户是否已通过身份验证,即他们是否已成功登录,无论用户是,那么您只需检查User.Identity.IsAuthenticated

@if (User.Identity.IsAuthenticated)
{
    <p>User is signed in.</p>
}
Run Code Online (Sandbox Code Playgroud)

如果你想验证用户是否具有特定的角色,那么你也可以User直接对主体对象进行操作,只检查该特定的角色:

@if (User.IsInRole("role-name"))
{
    <p>User is in role <em>role-name</em>.</p>
}
Run Code Online (Sandbox Code Playgroud)

否则,如果您想利用 ASP.NET Core 中授权系统的全部功能,您还可以根据配置的授权策略IAuthorizationService注入并授权用户:

@inject IAuthorizationService _authorizationService

@if ((await _authorizationService.AuthorizeAsync(User, "policy-name")).Succeeded)
{
    <p>User was authorized against policy <em>policy-name</em>.</p>
}
Run Code Online (Sandbox Code Playgroud)