Для Challenge
он контролируется IAuthenticationService
. AuthenticationService
вызовет AuthenticateAsync
, чтобы вызвать handler.AuthenticateAsync()
.
Не уверен, реализуете ли вы пользовательский IAuthenticationHandler
, я углублюсь в CookieAuthenticationHandler
.
Полный рабочий процесс для CookieAuthenticaiton
приведен ниже:
return Challenge()
, для Вызов
public virtual ChallengeResult Challenge()
=> new ChallengeResult();
ChanllengeResult
вызовет ExecuteResultAsync
public override async Task ExecuteResultAsync(ActionContext context)
{
if (context == null)
{
throw new ArgumentNullException(nameof(context));
}
var loggerFactory = context.HttpContext.RequestServices.GetRequiredService<ILoggerFactory>();
var logger = loggerFactory.CreateLogger<ChallengeResult>();
logger.ChallengeResultExecuting(AuthenticationSchemes);
if (AuthenticationSchemes != null && AuthenticationSchemes.Count > 0)
{
foreach (var scheme in AuthenticationSchemes)
{
await context.HttpContext.ChallengeAsync(scheme, Properties);
}
}
else
{
await context.HttpContext.ChallengeAsync(Properties);
}
}
context.HttpContext.ChallengeAsync
вызовет ChallengeAsync
public static Task ChallengeAsync(this HttpContext context, string scheme, AuthenticationProperties properties) =>
context.RequestServices.GetRequiredService<IAuthenticationService>().ChallengeAsync(context, scheme, properties);
Для CookieAuthenticationHandler
protected override async Task HandleChallengeAsync(AuthenticationProperties properties)
{
var redirectUri = properties.RedirectUri;
if (string.IsNullOrEmpty(redirectUri))
{
redirectUri = OriginalPathBase + Request.Path + Request.QueryString;
}
var loginUri = Options.LoginPath + QueryString.Create(Options.ReturnUrlParameter, redirectUri);
var redirectContext = new RedirectContext<CookieAuthenticationOptions>(Context, Scheme, Options, properties, BuildRedirectUri(loginUri));
await Events.RedirectToLogin(redirectContext);
}
Как вы могли заметить, HandleChallengeAsync
перенаправляет действие.
В моем варианте вы можете попробовать вернуть Forbid()
, в противном случае вам нужно будет переопределить HandleChallengeAsync
.