Browse Source

Use authentication scheme by default.

pull/9940/head
maliming 5 years ago
parent
commit
a112586110
  1. 22
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs
  2. 22
      framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs
  3. 7
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpAuthorizationExceptionHandlerOptions.cs
  4. 43
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs
  5. 75
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/DefaultAbpAuthorizationExceptionHandler.cs
  6. 2
      framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/IAbpAuthorizationExceptionHandler.cs
  7. 1
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpAuthorizationExceptionTestController_Tests.cs
  8. 1
      framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpAuthorizationExceptionTestPage_Tests.cs

22
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionFilter.cs

@ -77,20 +77,18 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
if (context.Exception is AbpAuthorizationException) if (context.Exception is AbpAuthorizationException)
{ {
if (await context.HttpContext.RequestServices.GetRequiredService<IAbpAuthorizationExceptionHandler>() await context.HttpContext.RequestServices.GetRequiredService<IAbpAuthorizationExceptionHandler>()
.HandleAsync(context.Exception.As<AbpAuthorizationException>(), context.HttpContext)) .HandleAsync(context.Exception.As<AbpAuthorizationException>(), context.HttpContext);
{
context.Exception = null; //Handled!
return;
}
} }
else
{
context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
context.HttpContext.Response.StatusCode = (int) context
.GetRequiredService<IHttpExceptionStatusCodeFinder>()
.GetStatusCode(context.HttpContext, context.Exception);
context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo));
context.HttpContext.Response.StatusCode = (int) context }
.GetRequiredService<IHttpExceptionStatusCodeFinder>()
.GetStatusCode(context.HttpContext, context.Exception);
context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo));
context.Exception = null; //Handled! context.Exception = null; //Handled!
} }

22
framework/src/Volo.Abp.AspNetCore.Mvc/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpExceptionPageFilter.cs

@ -88,20 +88,18 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
if (context.Exception is AbpAuthorizationException) if (context.Exception is AbpAuthorizationException)
{ {
if (await context.HttpContext.RequestServices.GetRequiredService<IAbpAuthorizationExceptionHandler>() await context.HttpContext.RequestServices.GetRequiredService<IAbpAuthorizationExceptionHandler>()
.HandleAsync(context.Exception.As<AbpAuthorizationException>(), context.HttpContext)) .HandleAsync(context.Exception.As<AbpAuthorizationException>(), context.HttpContext);
{
context.Exception = null; //Handled!
return;
}
} }
else
{
context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
context.HttpContext.Response.StatusCode = (int) context
.GetRequiredService<IHttpExceptionStatusCodeFinder>()
.GetStatusCode(context.HttpContext, context.Exception);
context.HttpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo));
context.HttpContext.Response.StatusCode = (int) context }
.GetRequiredService<IHttpExceptionStatusCodeFinder>()
.GetStatusCode(context.HttpContext, context.Exception);
context.Result = new ObjectResult(new RemoteServiceErrorResponse(remoteServiceErrorInfo));
context.Exception = null; //Handled! context.Exception = null; //Handled!
} }

7
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpAuthorizationExceptionHandlerOptions.cs

@ -2,13 +2,6 @@
{ {
public class AbpAuthorizationExceptionHandlerOptions public class AbpAuthorizationExceptionHandlerOptions
{ {
public bool UseAuthenticationScheme { get; set; }
public string AuthenticationScheme { get; set; } public string AuthenticationScheme { get; set; }
public AbpAuthorizationExceptionHandlerOptions()
{
UseAuthenticationScheme = true;
}
} }
} }

43
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/AbpExceptionHandlingMiddleware.cs

@ -68,30 +68,29 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling
if (exception is AbpAuthorizationException) if (exception is AbpAuthorizationException)
{ {
if (await httpContext.RequestServices.GetRequiredService<IAbpAuthorizationExceptionHandler>() await httpContext.RequestServices.GetRequiredService<IAbpAuthorizationExceptionHandler>()
.HandleAsync(exception.As<AbpAuthorizationException>(), httpContext)) .HandleAsync(exception.As<AbpAuthorizationException>(), httpContext);
{
return;
}
} }
else
var errorInfoConverter = httpContext.RequestServices.GetRequiredService<IExceptionToErrorInfoConverter>(); {
var statusCodeFinder = httpContext.RequestServices.GetRequiredService<IHttpExceptionStatusCodeFinder>(); var errorInfoConverter = httpContext.RequestServices.GetRequiredService<IExceptionToErrorInfoConverter>();
var jsonSerializer = httpContext.RequestServices.GetRequiredService<IJsonSerializer>(); var statusCodeFinder = httpContext.RequestServices.GetRequiredService<IHttpExceptionStatusCodeFinder>();
var options = httpContext.RequestServices.GetRequiredService<IOptions<AbpExceptionHandlingOptions>>().Value; var jsonSerializer = httpContext.RequestServices.GetRequiredService<IJsonSerializer>();
var options = httpContext.RequestServices.GetRequiredService<IOptions<AbpExceptionHandlingOptions>>().Value;
httpContext.Response.Clear();
httpContext.Response.StatusCode = (int)statusCodeFinder.GetStatusCode(httpContext, exception); httpContext.Response.Clear();
httpContext.Response.OnStarting(_clearCacheHeadersDelegate, httpContext.Response); httpContext.Response.StatusCode = (int)statusCodeFinder.GetStatusCode(httpContext, exception);
httpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true"); httpContext.Response.OnStarting(_clearCacheHeadersDelegate, httpContext.Response);
httpContext.Response.Headers.Add(AbpHttpConsts.AbpErrorFormat, "true");
await httpContext.Response.WriteAsync(
jsonSerializer.Serialize( await httpContext.Response.WriteAsync(
new RemoteServiceErrorResponse( jsonSerializer.Serialize(
errorInfoConverter.Convert(exception, options.SendExceptionsDetailsToClients) new RemoteServiceErrorResponse(
errorInfoConverter.Convert(exception, options.SendExceptionsDetailsToClients)
)
) )
) );
); }
} }
private Task ClearCacheHeaders(object state) private Task ClearCacheHeaders(object state)

75
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/DefaultAbpAuthorizationExceptionHandler.cs

@ -11,64 +11,57 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling
{ {
public class DefaultAbpAuthorizationExceptionHandler : IAbpAuthorizationExceptionHandler, ITransientDependency public class DefaultAbpAuthorizationExceptionHandler : IAbpAuthorizationExceptionHandler, ITransientDependency
{ {
public virtual async Task<bool> HandleAsync(AbpAuthorizationException exception, HttpContext httpContext) public virtual async Task HandleAsync(AbpAuthorizationException exception, HttpContext httpContext)
{ {
var handlerOptions = httpContext.RequestServices.GetRequiredService<IOptions<AbpAuthorizationExceptionHandlerOptions>>().Value; var handlerOptions = httpContext.RequestServices.GetRequiredService<IOptions<AbpAuthorizationExceptionHandlerOptions>>().Value;
if (handlerOptions.UseAuthenticationScheme) var isAuthenticated = httpContext.User.Identity?.IsAuthenticated ?? false;
{ var authenticationSchemeProvider = httpContext.RequestServices.GetRequiredService<IAuthenticationSchemeProvider>();
var isAuthenticated = httpContext.User.Identity?.IsAuthenticated ?? false;
var authenticationSchemeProvider = httpContext.RequestServices.GetRequiredService<IAuthenticationSchemeProvider>();
AuthenticationScheme scheme = null; AuthenticationScheme scheme = null;
if (!handlerOptions.AuthenticationScheme.IsNullOrWhiteSpace()) if (!handlerOptions.AuthenticationScheme.IsNullOrWhiteSpace())
{
scheme = await authenticationSchemeProvider.GetSchemeAsync(handlerOptions.AuthenticationScheme);
if (scheme == null)
{
throw new AbpException($"No authentication scheme named {handlerOptions.AuthenticationScheme} was found.");
}
}
else
{
if (isAuthenticated)
{ {
scheme = await authenticationSchemeProvider.GetSchemeAsync(handlerOptions.AuthenticationScheme); scheme = await authenticationSchemeProvider.GetDefaultForbidSchemeAsync();
if (scheme == null) if (scheme == null)
{ {
throw new AbpException($"No authentication scheme named {handlerOptions.AuthenticationScheme} was found."); throw new AbpException($"There was no DefaultForbidScheme found.");
} }
} }
else else
{ {
if (isAuthenticated) scheme = await authenticationSchemeProvider.GetDefaultChallengeSchemeAsync();
{ if (scheme == null)
scheme = await authenticationSchemeProvider.GetDefaultForbidSchemeAsync();
if (scheme == null)
{
throw new AbpException($"There was no DefaultForbidScheme found.");
}
}
else
{ {
scheme = await authenticationSchemeProvider.GetDefaultChallengeSchemeAsync(); throw new AbpException($"There was no DefaultChallengeScheme found.");
if (scheme == null)
{
throw new AbpException($"There was no DefaultChallengeScheme found.");
}
} }
} }
}
var handlers = httpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>(); var handlers = httpContext.RequestServices.GetRequiredService<IAuthenticationHandlerProvider>();
var handler = await handlers.GetHandlerAsync(httpContext, scheme.Name); var handler = await handlers.GetHandlerAsync(httpContext, scheme.Name);
if (handler == null) if (handler == null)
{ {
throw new AbpException($"No handler of {scheme.Name} was found."); throw new AbpException($"No handler of {scheme.Name} was found.");
}
if (isAuthenticated)
{
await handler.ForbidAsync(null);
}
else
{
await handler.ChallengeAsync(null);
}
return true;
} }
return false; if (isAuthenticated)
{
await handler.ForbidAsync(null);
}
else
{
await handler.ChallengeAsync(null);
}
} }
} }
} }

2
framework/src/Volo.Abp.AspNetCore/Volo/Abp/AspNetCore/ExceptionHandling/IAbpAuthorizationExceptionHandler.cs

@ -6,6 +6,6 @@ namespace Volo.Abp.AspNetCore.ExceptionHandling
{ {
public interface IAbpAuthorizationExceptionHandler public interface IAbpAuthorizationExceptionHandler
{ {
Task<bool> HandleAsync(AbpAuthorizationException exception, HttpContext httpContext); Task HandleAsync(AbpAuthorizationException exception, HttpContext httpContext);
} }
} }

1
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpAuthorizationExceptionTestController_Tests.cs

@ -34,7 +34,6 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
services.Configure<AbpAuthorizationExceptionHandlerOptions>(options => services.Configure<AbpAuthorizationExceptionHandlerOptions>(options =>
{ {
options.UseAuthenticationScheme = true;
options.AuthenticationScheme = "Cookie"; options.AuthenticationScheme = "Cookie";
}); });
} }

1
framework/test/Volo.Abp.AspNetCore.Mvc.Tests/Volo/Abp/AspNetCore/Mvc/ExceptionHandling/AbpAuthorizationExceptionTestPage_Tests.cs

@ -34,7 +34,6 @@ namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling
services.Configure<AbpAuthorizationExceptionHandlerOptions>(options => services.Configure<AbpAuthorizationExceptionHandlerOptions>(options =>
{ {
options.UseAuthenticationScheme = true;
options.AuthenticationScheme = "Cookie"; options.AuthenticationScheme = "Cookie";
}); });
} }

Loading…
Cancel
Save