我有一本书.NET Core 2.0应用程序,但存在授权问题.我想对特殊请求使用自定义授权.标头和标准默认身份验证.
public IServiceProvider ConfigureServices(IServiceCollection services)
{
// ...
services.AddAuthorization(options =>
{
options.AddPolicy(DefaultAuthorizedPolicy, policy =>
{
policy.Requirements.Add(new TokenAuthRequirement());
});
});
services.AddSingleton<IAuthorizationHandler, AuthTokenPolicy>();
// ...
}
AuthTokenPolicy.cs
:
public class AuthTokenPolicy : AuthorizationHandler<TokenAuthRequirement>
{
protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, TokenAuthRequirement requirement)
{
var filterContext = context.Resource as AuthorizationFilterContext;
var response = filterContext.HttpContext.Response;
try
{
// some validation code
var isValidToken = isValidTokenTask.Result;
if (!isValidToken)
{
response.StatusCode = 401;
return Task.CompletedTask;
}
response.StatusCode = 200;
context.Succeed(requirement);
}
catch (Exception)
{
return Task.CompletedTask;
}
return Task.CompletedTask;
}
}
HomeController.cs
年后:
[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]
public async Task<IActionResult> IsVisible()
如果我使用了错误的请求.AuthTokenPolicy
中的标题我看到了,但在日志(log)中我看到了这个错误:
系统InvalidOperationException:未指定authenticationScheme,也未找到DefaultChallengeScheme.\r\n在Microsoft.AspNetCore.认证.认证服务.迪乌11.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.Mvc.挑战者结果.d__14.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.Mvc.内部的资源调用者.d__19.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.Mvc.内部的资源调用者.d__17.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.Mvc.内部的资源调用者.d__15.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.建设者路由软件.d__4.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.诊断学.StatusCodePagesMiddleware.d__3.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n位于React.AspNet.Babelfile.5.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n在Microsoft上.AspNetCore.认证.认证中间件.d__6.MoveNext().运行时.例外服务.例外DispatchInfo.在系统上抛出().运行时.编译器服务.任务等待者.HandleNonSuccessAndDebuggerNotification(任务)\r\n位于核心位置.常见的中间件.日志(log)记录.d__3.D:\Dev\microservicePDP\Template\core中的MoveNext().公共\中间件\日志(log)中间件.政务司司长:第72行
在阅读了Migrating Authentication and Identity to ASP.NET Core 2.0之后,我将这段代码添加到Startup.cs中
文章引述:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
});
如果以下条件之一为真,则在2.0中定义默认方案:
我在ConfigureServices()
中加了AuthenticationScheme
和DefaultChallengeScheme
.这没用,这里也有同样的错误.我试着在Startup.Configure()
方法中使用app.UseAuthentication();
,但没有结果.
如何在没有身份验证的情况下使用自定义授权?