Challenge () всегда перенаправляет на страницу входа - PullRequest
0 голосов
/ 05 ноября 2018

Я пытаюсь авторизовать свой метод действий. Все работает нормально, но мой Challenge () метод всегда перенаправляет на страницу входа , даже если Я уже вошел в систему . Я пытаюсь вернуть метод Forbid () , и он перенаправляет на страницу Access Denied , как и должно быть. В чем может быть проблема с методом Challenge ()?

public async Task<IActionResult> Edit(int id)
{
     var project = await _context.Project.Include(p => p.OrganizationsLink).FirstOrDefaultAsync(p => p.Id == id);
     if (project == null)            
        return NotFound();

     //AUTHORIZATION
     var allowed = await _authz.AuthorizeAsync(User, null, new ProjectEditRequirement(project));
     if (!allowed.Succeeded)
        return Challenge();             

     return View(project);
}

1 Ответ

0 голосов
/ 06 ноября 2018

Для 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...