0

我在启动时注册我的身份验证方案

var authBuilder = 
    services.AddAuthentication(OpenIdConnectDefaults.AuthenticationScheme)
            .AddScheme<MyCustomHandlerOptions, MyCustomHandler>("MyCustomScheme", null)
            .AddMicrosoftIdentityWebApp(Configuration.GetSection("AzureAd"))
            .EnableTokenAcquisitionToCallDownstreamApi(initialScopes)
            .AddInMemoryTokenCaches();

我的自定义身份验证处理程序还没有做太多

protected override Task HandleChallengeAsync(AuthenticationProperties properties)
{
    Context.Response.Redirect("/MyLoginPage");
    return Task.CompletedTask;
}

protected override Task<AuthenticateResult> HandleAuthenticateAsync()
{
    return Task.FromResult(AuthenticateResult.NoResult());
}

当使用带有指定方案的 Authorize 属性时,一切正常。我只希望在这样指定方案时使用我的 Auth 处理程序。

[Authorize(AuthenticationSchemes = "MyCustomScheme")]

我创建了一个控制器动作来强制 Oidc 挑战。

[HttpGet()]
[AllowAnonymous]
public IActionResult SignInOidc([FromQuery] string redirectUri)
{
   string redirect;
   if (!string.IsNullOrEmpty(redirectUri) && Url.IsLocalUrl(redirectUri))
   {
      redirect = redirectUri;
   }
   else
   {
      redirect = Url.Content("~/")!;
   }

   return Challenge(
       new AuthenticationProperties 
       { 
           RedirectUri = redirect 
       },
       OpenIdConnectDefaults.AuthenticationScheme);
}

问题是,当我导航到 时Account/SignInOidcHandleAuthenticateAsync()在我的自定义 AuthenticationHandler 中调用。即使我正在返回AuthenticateResult.NoResult(),该HandleChallengeAsync()方法仍然被调用。

这导致我的页面重定向到我的自定义登录页面,而不是重定向到 Oidc 提供程序。

当针对不同方案调用质询时,有没有办法告诉我的处理程序不要进行重定向?

4

1 回答 1

0

我想到了。

问题是我的 SigninOidc 方法没有提供重定向 url。我的应用程序重定向到我的 oauth 提供商,然后因为我已经登录而立即转回。

这导致我的应用程序返回到我的默认路径 (/),这再次启动了整个身份验证过程。

我使用的浏览器没有地址栏,所以我没有注意到重定向。

于 2021-08-11T18:56:06.697 回答