autheticate.fail не может перенаправить на несанкционированную проверку подлинности ядра asp.net - PullRequest
0 голосов
/ 16 ноября 2018

В моем приложении включена проверка подлинности Windows

ниже приведен код моего обработчика

public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
    {
        private readonly IUser _userService;
        public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
            ILoggerFactory logger,
            UrlEncoder encoder,
            ISystemClock clock,
            IUser UserService
            ) : base(options, logger, encoder, clock)
        {
            _userService = UserService;
        }
        protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
        {
            var a = Request.HttpContext.User.Identity.Name;

            User user = null;
            user = await _userService.IsAuthenicated(a, "");
            // Context.Response.StatusCode = StatusCodes.Status401Unauthorized;
            // Context.res = new RedirectToActionResult("Index", "Home", null);
            //Context.Response.StatusCode = StatusCodes.Status401Unauthorized;

            if (user == null)
            {

                return AuthenticateResult.Fail("Invalid Username or Password");
            }
            var claims = new[] {
                new Claim(ClaimTypes.NameIdentifier,user.UserName),
                new Claim(ClaimTypes.Name, user.UserName),
            };

            var identity = new ClaimsIdentity(claims, Scheme.Name);
            var principal = new ClaimsPrincipal(identity);
            var ticket = new AuthenticationTicket(principal, Scheme.Name);


            return AuthenticateResult.Success(ticket);
        }
    }

autheticateresult.fail, чтобы цикл запрашивал учетные данные Windows и не перенаправлял их на страницу ошибки пользователя.в то время как я попробовал с anomyouns, он работает нормально.

1 Ответ

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

autheticateresult.fail заставляет цикл запрашивать учетные данные Windows, а не перенаправить на страницу пользовательских ошибок

При вызове AuthenticateResult.Fail произойдет сбой Windows Authentication, и IIS проверит цикл проверки подлинности.

В качестве обходного пути вы можете попробовать UseStatusCodePages перенаправить на страницу ошибки,

        app.UseStatusCodePages(async context => {
            if (context.HttpContext.Response.StatusCode == 401)
            {
                // your redirect
                context.HttpContext.Response.Redirect("/Home/Error");
            }
        });
        app.UseAuthentication();

Для другого варианта вы можете настроить HandleChallengeAsync для BasicAuthenticationHandler.

public class BasicAuthenticationHandler : AuthenticationHandler<AuthenticationSchemeOptions>
{
    public BasicAuthenticationHandler(IOptionsMonitor<AuthenticationSchemeOptions> options,
        ILoggerFactory logger,
        UrlEncoder encoder,
        ISystemClock clock
        ) : base(options, logger, encoder, clock)
    {
    }
    protected override async Task<AuthenticateResult> HandleAuthenticateAsync()
    {
        return AuthenticateResult.Fail("Invalid Username or Password");
    }

    protected override Task HandleChallengeAsync(AuthenticationProperties properties)
    {
        Context.Response.Redirect("/Home/Error");// redirect to your error page
        return Task.CompletedTask;
    }
}
...