标签: asp.net-authorization

Blazor 在尝试激活 DefaultAuthorizationPolicyProvider 时无法解析 AuthorizationOptions

我正在开发 Blazor wasm 应用程序,并在 App.razor 文件中添加 AuthorizeRouteView 组件时遇到异常。由于相关资源很少,我花了很多时间尝试解决,所以我想在这里分享解决方案:

错误消息是:

System.InvalidOperationException:尝试激活“Microsoft.AspNetCore.Authorization.DefaultAuthorizationPolicyProvider”时,无法解析“Microsoft.Extensions.Options.IOptions`1[Microsoft.AspNetCore.Authorization.AuthorizationOptions]”类型的服务。

包版本:

    <PackageReference Include="Microsoft.AspNetCore.Blazor.Build" Version="3.2.0-preview1.20073.1" PrivateAssets="all" />
    <PackageReference Include="Microsoft.AspNetCore.Blazor.DevServer" Version="3.2.0-preview1.20073.1" PrivateAssets="all" />
    <PackageReference Include="Microsoft.AspNetCore.Blazor.HttpClient" Version="3.2.0-preview1.20073.1" />
    <PackageReference Include="Microsoft.AspNetCore.Components.Authorization" Version="3.1.1" PrivateAssets="all"/>
Run Code Online (Sandbox Code Playgroud)

以下描述我只需要在 Program.cs 服务中添加 AddAuthorizationCore() :

builder.Services.AddAuthorizationCore();
Run Code Online (Sandbox Code Playgroud)

这然后产生上述异常......

asp.net-authorization blazor blazor-client-side

4
推荐指数
1
解决办法
1296
查看次数

Asp.Net Core / IdentityServer综合授权

对于我正在从事的项目,我需要使用公共身份服务器创建两个单独的(但并非完全无关)应用程序。我为此选择了IdentityServer4,它对我来说很好用。

但是,我需要能够将用户分配到多个公司/项目(是的,这是现实生活中的情况),并且可能在每个公司/项目中分配不同的角色。但是,我无法为此设计索赔结构。

我看到两种可以解决此问题的方法;

  1. 为每个公司/项目创建一个复杂的声明,其中将包含companyId和用户在该公司中的角色。可以是JSON形式,也可以是自定义字符串,例如,companyGUID_roleClaim 但是,当我进行小型研究时,我意识到有很多人认为这不是正确的方法,因为他们认为声明应该是简单的键值对。

  2. 让应用程序连接/查询身份数据库,以检索与活动用户关联的公司/项目和角色,并使用基于这些数据的策略来保护资源。

也许我从错误的角度看待它,或者这两个中的一个是可以接受的。或者还有另一种解决方案。您能帮我找到解决这个问题的方法吗?

asp.net asp.net-authorization asp.net-core identityserver4

3
推荐指数
1
解决办法
440
查看次数

如何在没有授权属性的情况下在 ASP Core 2 方法中获取用户声明?

我有一个可以匿名访问的 API 方法。我想使用资源授权来确定用户是否具有访问权限。如果对象是“公共的”,则任何人(包括匿名用户)都可以访问它。如果对象是“私有的”,则只能由登录用户查看。如果我在方法上有授权属性,则此逻辑工作正常,但如果没有,则即使用户登录也没有声明。

有没有办法在没有 Authorize 属性的方法中获取用户的声明?

方法如下所示:

    [HttpGet]
    [Route("name/{name}")]
    public async Task<IActionResult> Get(string name)
    {
        var activity = Repo.GetCommandLineActivity(name);
        if (activity == null)
        {
            return NotFound();
        }

        var isAuthed = await _authService.AuthorizeAsync(User, activity, new ViewIPublicPrivateRequirement());
        if (isAuthed.Succeeded)
        {
            return Ok(activity);
        }

        return Unauthorized();
    }
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-authorization .net-core asp.net-core

3
推荐指数
1
解决办法
2700
查看次数

如何在ASP.NET Core 2.x Web应用程序中全局实现基于AD组的授权?

我想知道是否有人可以为我指明一个方向或一个例子,使我获得完整的代码以得到一个总体思路?

谢谢。

更新: 我在Startup.cs中只有以下代码,并确保launchSettings.json中的windowsAutication为true。

public void ConfigureServices(IServiceCollection services)
{
    services.AddMvc();

    services.AddMvc(config =>
    {
        var policy = new AuthorizationPolicyBuilder()
                         .RequireAuthenticatedUser()
                         //.RequireRole(@"Departmental - Information Technology - Development")   // Works
                         .RequireRole(@"*IT.Center of Excellence.Digital Workplace")              // Error
                         .Build();
        config.Filters.Add(new AuthorizeFilter(policy));
    });

}
Run Code Online (Sandbox Code Playgroud)

我想我已启用身份验证,并尝试授权指定AD组中的用户可以在全局级别访问该应用程序。

如果我使用注释的RequireRole可以正常工作,但使用未注释的RequireRole则会给我这个错误:Win32Exception:主域和受信任域之间的信任关系失败。

堆栈的第一行显示:System.Security.Principal.NTAccount.TranslateToSids(IdentityReferenceCollection sourceAccounts,在bool someFailed外)

知道为什么吗?

从上面的更新我的理解

似乎在RequireRole中指定的组名称是电子邮件通讯组列表而不是安全组。如果我使用其他一些AD组,则可以正常工作,但会出现以下新错误:

InvalidOperationException:未指定authenticationScheme,也未找到DefaultForbidScheme。

如果我在Startup.cs的ConfigureServices中添加IIS默认authenticationScheme

services.AddAuthentication(IISDefaults.AuthenticationScheme);
Run Code Online (Sandbox Code Playgroud)

它给了我一个HTTP 403页面:该网站拒绝显示此页面

所以这是最终的代码:

services.AddAuthentication(IISDefaults.AuthenticationScheme);
Run Code Online (Sandbox Code Playgroud)

如果我理解错误,请纠正我。谢谢。

authorization asp.net-authorization asp.net-core asp.net-core-2.0 asp.net-core-mvc-2.0

3
推荐指数
1
解决办法
6664
查看次数

.NET Core API 中的自定义授权过滤器

我想在使用我的核心 api 访问任何数据之前对用户进行授权,所以我尝试使用 JWT 身份验证。我在使用 api 登录用户时成功生成了令牌,并将该令牌保存在会话中的客户端,现在每当用户想要使用 api 访问任何数据时,我都会将该令牌在标头中发送到 api,并且我想验证该 JWT 令牌使用自定义授权过滤器。我已经创建了自定义授权过滤器并将其应用到我的 GetMenu api 上,并且我能够成功验证该令牌,但在授权过滤器中进行令牌验证后,它不会在我的 GetMenu api 上命中它。

这是我的 AccountController 代码:

[Filters.Authorization]
[AllowAnonymous]
[HttpPost]
[Route("GetMenu")]
public IActionResult GetMenu(string clientid, int rolecode, string repcode)
{
    //further process
}
Run Code Online (Sandbox Code Playgroud)

这是我的 Filters.Authorization 代码:

public class Authorization: AuthorizeAttribute, IAuthorizationFilter
{
    public void OnAuthorization(AuthorizationFilterContext filterContext)
    {
        if (!ValidateToken(filterContext.HttpContext.Request.Headers["token"]))
        {
            filterContext.Result = new UnauthorizedResult();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在 OnAuthorization 方法和 GetMenu api 上有断点。我通过邮递员调用我的 GetMenu api 进行测试,它成功地在 Filters.Authorization 中的 OnAuthorization 方法上命中它并验证我的 JWT 令牌并在邮递员中显示状态代码:200,但在成功令牌验证后,它应该在 GetMenu api 上命中以进行进一步的操作正在处理数据,但没有命中。可能是什么问题?我缺少什么?请帮忙。

authorization core-api asp.net-authorization .net-core asp.net-core

3
推荐指数
1
解决办法
2万
查看次数

自定义 AuthorizeAttribute 未实现

在我们的 MVC 解决方案中,我们有两个自定义实现AuthorizeAttribute- 一个已命名BasicHttpAuthorizeAttribute并已在生产中使用多年,另一个RoleAuthorizeAttribute是最近添加的。

创建时RoleAuthorizeAttribute我只是复制BasicHttpAuthorizeAttribute并修改了一些已经覆盖的方法。

这两个属性都用于验证用户身份并RoleAuthorizeAttribute验证用户是否具有所需的角色。

但是,RoleAuthorizeAttribute永远不会对用户进行身份验证。它只是没有被调用,而是当非登录用户到达控制器操作并且代码请求上下文用户时,我们的 MVC 控制器会抛出异常。

下面是这个习俗的概要AuthorizeAttribute。如果我在所有这些方法上放置断点,我发现在发出请求时它们都不会被命中。

谁能解释为什么这个类不用于验证用户身份?为什么未经身份验证的用户不会被重定向到登录页面,但如果我交换RoleAuthorizeBasicHttpAuthorize简单地替换基本用户Authorize,那么它们就会被重定向?

[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]    
public class RoleAuthorizeAttribute : System.Web.Http.AuthorizeAttribute
{
    /// <summary>
    /// Gets or sets the <see cref="Role"/> enumerations required for authorization.
    /// </summary>
    public Role[] RequiredRoles
    {
        get {...}
        set {...}
    }

    public bool RequireSsl { get; set; …
Run Code Online (Sandbox Code Playgroud)

c# authentication authorization authorize-attribute asp.net-authorization

3
推荐指数
1
解决办法
618
查看次数

如何在 ASP.NET Core 3.1 中访问 IAuthorizationHandler 中的会话数据?

我在自定义授权处理程序中访问会话数据有困难,而它在其他地方工作。

会话在控制器操作中正常工作,但是当我尝试使用IHttpContextAccessor.HttpContext.Sessiona访问它时MyAuthorizationHandler.HandleRequirementAsync,我收到InvalidOperationException“尚未为此应用程序或请求配置会话。”。在IHttpContextAccessor访问查询,饼干等-但无法访问会话数据。

如果我尝试从控制器访问相同MyAuthorizationHandlerIHttpContextAccessor,则会话数据可用。

MyAuthorizationHandler作为单例注入ConfigureServices,完整的初始化顺序:

public void ConfigureServices(IServiceCollection services)
{
    services.AddDistributedMemoryCache(); 
    services.AddSession(); 
    services.AddDefaultIdentity...
    services.AddControllersWithViews();
    services.AddRazorPages();
    services.AddControllers...
    services.AddAuthentication...
    services.AddAuthorization...
    services.AddHttpContextAccessor(); 
    services.AddSingleton<IAuthorizationHandler, MyAuthorizationHandler>(); 
    services.Configure<CookiePolicyOptions>...
    services.AddMvc(o => o.EnableEndpointRouting = false);
}

public void Configure(...)
{
    app.UseRouting();
    app.UseAuthentication();
    app.UseAuthorization();
    app.UseSession();
    app.UseEndpoints...
    app.UseMvc();
}
Run Code Online (Sandbox Code Playgroud)

注意:我不能在这个处理程序中使用声明,我需要会话数据。

c# asp.net-authorization asp.net-core asp.net-core-3.1

3
推荐指数
1
解决办法
682
查看次数

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

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

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

c# asp.net-authorization asp.net-core razor-pages

3
推荐指数
1
解决办法
3476
查看次数

ASP.NET Core控制器注册授权包失败

如果我包含此包,我的 asp.net core 3.1 项目会引发异常(上下文:I\xe2\x80\x99m 尝试创建自定义授权策略):

\n
<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="5.0.3" />\n
Run Code Online (Sandbox Code Playgroud)\n

这是在startup.cs中抛出的异常和方法:

\n
services.AddControllers();\n    System.ArgumentNullException: \'Value cannot be null. (Parameter \'configure\')\'\n
Run Code Online (Sandbox Code Playgroud)\n

这是完整的软件包列表。是否存在一些我不知道的冲突?当我创建一个类时,VS 建议使用该包AuthorizationHandler

\n
<PackageReference Include="Azure.Extensions.AspNetCore.Configuration.Secrets" Version="1.0.1" />\n<PackageReference Include="Azure.Identity" Version="1.2.3" />\n<PackageReference Include="Azure.Security.KeyVault.Secrets" Version="4.1.0" />\n<PackageReference Include="CorrelationId" Version="3.0.0" />\n<PackageReference Include="Microsoft.ApplicationInsights.AspNetCore" Version="2.15.0" />\n<PackageReference Include="Microsoft.AspNetCore.Authentication.AzureAD.UI" Version="3.1.7" />\n<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="5.0.3" />\n<PackageReference Include="Microsoft.AspNetCore.Mvc.NewtonsoftJson" Version="3.1.9" />\n<PackageReference Include="Microsoft.AspNetCore.OData" Version="7.5.2" />\n<PackageReference Include="Microsoft.Identity.Web" Version="1.2.0" />\n<PackageReference Include="NSwag.AspNetCore" Version="13.8.2" />\n
Run Code Online (Sandbox Code Playgroud)\n

authorization asp.net-authorization asp.net-core

3
推荐指数
1
解决办法
1807
查看次数

asp.net 默认授权(不带[Authorize])

我有一个 asp.netcore .net 5 应用程序。

我已获得使用[Authorize]控制器端点上方属性的授权。

如何使其在不使用[Authorize]属性的情况下使用授权?以下是我设置授权的方法:

我有这个ConfigureServices

public void ConfigureServices(IServiceCollection services)
{...
        FirebaseApp.Create(new AppOptions()
        {
            Credential = GoogleCredential.FromFile("firebase_admin_sdk.json"),
        });

        services
        .AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
        .AddJwtBearer(options =>
        {
            options.Authority = "https://securetoken.google.com/vepo-xxx";
            options.TokenValidationParameters = new TokenValidationParameters
            {
                ValidateIssuer = true,
                ValidIssuer = "https://securetoken.google.com/vepo-xxx",
                ValidateAudience = true,
                ValidAudience = "vepo-xxx",
                ValidateLifetime = true
            };
        });
...}
Run Code Online (Sandbox Code Playgroud)

我有Configure

public void Configure(IApplicationBuilder app, IWebHostEnvironment env, VepoContext context, ISearchIndexService searchIndexService)
{...
    app.UseAuthentication();
    app.UseAuthorization();
...}
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-authorization asp.net-core asp.net5 .net-5

3
推荐指数
1
解决办法
831
查看次数