我正在开发 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)
这然后产生上述异常......
对于我正在从事的项目,我需要使用公共身份服务器创建两个单独的(但并非完全无关)应用程序。我为此选择了IdentityServer4,它对我来说很好用。
但是,我需要能够将用户分配到多个公司/项目(是的,这是现实生活中的情况),并且可能在每个公司/项目中分配不同的角色。但是,我无法为此设计索赔结构。
我看到两种可以解决此问题的方法;
为每个公司/项目创建一个复杂的声明,其中将包含companyId和用户在该公司中的角色。可以是JSON形式,也可以是自定义字符串,例如,companyGUID_roleClaim
但是,当我进行小型研究时,我意识到有很多人认为这不是正确的方法,因为他们认为声明应该是简单的键值对。
让应用程序连接/查询身份数据库,以检索与活动用户关联的公司/项目和角色,并使用基于这些数据的策略来保护资源。
也许我从错误的角度看待它,或者这两个中的一个是可以接受的。或者还有另一种解决方案。您能帮我找到解决这个问题的方法吗?
我有一个可以匿名访问的 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) 我想知道是否有人可以为我指明一个方向或一个例子,使我获得完整的代码以得到一个总体思路?
谢谢。
更新: 我在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
我想在使用我的核心 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
在我们的 MVC 解决方案中,我们有两个自定义实现AuthorizeAttribute- 一个已命名BasicHttpAuthorizeAttribute并已在生产中使用多年,另一个RoleAuthorizeAttribute是最近添加的。
创建时RoleAuthorizeAttribute我只是复制BasicHttpAuthorizeAttribute并修改了一些已经覆盖的方法。
这两个属性都用于验证用户身份并RoleAuthorizeAttribute验证用户是否具有所需的角色。
但是,RoleAuthorizeAttribute永远不会对用户进行身份验证。它只是没有被调用,而是当非登录用户到达控制器操作并且代码请求上下文用户时,我们的 MVC 控制器会抛出异常。
下面是这个习俗的概要AuthorizeAttribute。如果我在所有这些方法上放置断点,我发现在发出请求时它们都不会被命中。
谁能解释为什么这个类不用于验证用户身份?为什么未经身份验证的用户不会被重定向到登录页面,但如果我交换RoleAuthorize或BasicHttpAuthorize简单地替换基本用户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
我在自定义授权处理程序中访问会话数据有困难,而它在其他地方工作。
会话在控制器操作中正常工作,但是当我尝试使用IHttpContextAccessor.HttpContext.Sessiona访问它时MyAuthorizationHandler.HandleRequirementAsync,我收到InvalidOperationException“尚未为此应用程序或请求配置会话。”。在IHttpContextAccessor访问查询,饼干等-但无法访问会话数据。
如果我尝试从控制器访问相同MyAuthorizationHandler的IHttpContextAccessor,则会话数据可用。
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)
注意:我不能在这个处理程序中使用声明,我需要会话数据。
我正在开发一个 dotnet core/js 应用程序,其中包括身份验证页面在内的所有前端代码都是使用 JS 框架生成的,其中捆绑的前端被注入到单个 Razor 页面中。前端从控制器 api 端点访问所有 dotnet 核心逻辑。身份验证使用不记名令牌,并且 [Authorize(role='whatever')] 在多个控制器中使用。
由于某种原因,单个 javascript 插件从 razor 页面注入到应用程序中。我基本上需要这个插件在用户经过身份验证之前不可见。这不是“秘密”内容的问题,但该插件在用户经过身份验证之前没有用处。有没有一种简单的方法可以让我查明用户是否在代码的 CSHTML 中与控制器属性一样获得授权?我一直在四处寻找,但没有发现任何有用的东西。不是 C# 或 dotnet core 的专家(主要从事前端工作)并且最简单的解决方案将不胜感激。不知道我是否遗漏了任何相关信息。如果是这样,请告诉我!
如果我包含此包,我的 asp.net core 3.1 项目会引发异常(上下文:I\xe2\x80\x99m 尝试创建自定义授权策略):
\n<PackageReference Include="Microsoft.AspNetCore.Authorization" Version="5.0.3" />\nRun Code Online (Sandbox Code Playgroud)\n这是在startup.cs中抛出的异常和方法:
\nservices.AddControllers();\n System.ArgumentNullException: \'Value cannot be null. (Parameter \'configure\')\'\nRun Code Online (Sandbox Code Playgroud)\n这是完整的软件包列表。是否存在一些我不知道的冲突?当我创建一个类时,VS 建议使用该包AuthorizationHandler。
<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" />\nRun Code Online (Sandbox Code Playgroud)\n 我有一个 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-core ×8
c# ×4
asp.net ×3
.net-core ×2
.net-5 ×1
asp.net5 ×1
blazor ×1
core-api ×1
razor-pages ×1