【发布时间】:2018-04-29 15:57:46
【问题描述】:
我有一个 .NET Core 2.0 应用程序,但存在授权问题。我想对特殊要求使用自定义授权。标头和标准默认身份验证。
首先,我在Startup.cs中添加配置:
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 中使用了错误的 request.header,我会看到它,但在日志中我会看到此错误:
System.InvalidOperationException: 未指定 authenticationScheme,也未找到 DefaultChallengeScheme。\r\n 在 Microsoft.AspNetCore.Authentication.AuthenticationService.d__11.MoveNext()\r\n--- 上一个堆栈跟踪结束引发异常的位置 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 Microsoft.AspNetCore .Mvc.ChallengeResult.d__14.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\ n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__19.MoveNext()\r\n--- 从上一个位置结束堆栈跟踪在 System.Runtime.ExceptionServices.ExceptionDispatc 引发了异常 ---\r\n hInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__17.MoveNext()\r\n---从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r \n 在 Microsoft.AspNetCore.Mvc.Internal.ResourceInvoker.d__15.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.ExceptionServices。 ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.AspNetCore.Builder.RouterMiddleware.d__4.MoveNext()\r\n--- 结束来自先前引发异常的位置的堆栈跟踪 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Thr ow()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 Microsoft.AspNetCore.Diagnostics.StatusCodePagesMiddleware.d__3.MoveNext()\r\n--- 堆栈跟踪结束从先前引发异常的位置 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 React .AspNet.BabelFileMiddleware.d__5.MoveNext()\r\n--- 从先前引发异常的位置结束堆栈跟踪 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()\r\ n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)\r\n 在 Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.d__6.MoveNext()\r\n--- 堆栈跟踪从上一个异常位置结束抛出 ---\r\n 在 System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() \r\n 在 System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(任务任务)\r\n 在 D:\Dev\microservicePDP\Template\core.common\ 中的 core.common.Middleware.LoggingMiddleware.d__3.MoveNext()中间件\LoggingMiddleware.cs:第 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 中定义默认方案: 您希望用户自动登录 您使用 [Authorize] 属性或授权策略而不指定方案
我在ConfigureServices() 中添加了AuthenticationScheme 和DefaultChallengeScheme。它没有帮助,这里同样的错误。我尝试在Startup.Configure() 方法中使用app.UseAuthentication();,但没有结果。
如何在没有身份验证的情况下使用自定义授权?
【问题讨论】:
-
所以在使用
AddAuthentication之后,你又使用了[Authorize(Policy = Startup.DefaultAuthorizedPolicy)]? -
是的。不对吗?
-
我只是在确认您写的内容。我假设
DefaultChallengeScheme仅设置为默认授权策略....无论哪种方式尝试我的答案
标签: c# asp.net .net asp.net-core-2.0