.Net BFF OAuth2与OpenOIdConnect和Azure AD在身份验证后重定向循环

h7appiyu  于 2023-08-02  发布在  .NET
关注(0)|答案(1)|浏览(114)

我想实现一个Web API,它充当Angular SPA的BFF,并使用Azure Active Directory处理用户身份验证。以便后端为用户存储承载令牌和刷新令牌。我在Azure中设置了所有设置并配置了应用程序。
我的重定向URL看起来像:

https://localhost/signin-oidc

字符串
这是我的app配置:

var builder = WebApplication.CreateBuilder(args);

builder.Services.AddAuthentication(options =>
    {
        options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        options.DefaultSignOutScheme = OpenIdConnectDefaults.AuthenticationScheme;
    })
    .AddCookie(options =>
    {
        options.ExpireTimeSpan = TimeSpan.FromHours(1);
        options.SlidingExpiration = false;
        options.Cookie.SameSite = SameSiteMode.Strict;
        options.Cookie.Name = "__Host-ui";
        options.Events.OnSigningOut = async e =>
        {
            await e.HttpContext.RevokeRefreshTokenAsync();
        };
    })
    .AddOpenIdConnect(options =>
    {
        options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
        
        options.Authority = "https://login.microsoftonline.com/{tenantId}/v2.0";
        options.ClientId = "clientId from config";
        options.ClientSecret = "secret from config";
        
        options.UsePkce = true;
        
        options.ResponseType = OpenIdConnectResponseType.Code;
        options.ResponseMode = OpenIdConnectResponseMode.Query;
        
        options.Scope.Clear();
        options.Scope.Add("openid");
        options.Scope.Add("profile");
        options.Scope.Add("email");
        options.Scope.Add("offline_access");
        options.Scope.Add("api");
        options.Scope.Add("name");
        options.Scope.Add("ipaddr");
        
        options.GetClaimsFromUserInfoEndpoint = true;
        options.SaveTokens = true;
        options.MapInboundClaims = false;

        options.CorrelationCookie.SecurePolicy = CookieSecurePolicy.Always;
        options.NonceCookie.SecurePolicy = CookieSecurePolicy.Always;
        options.RequireHttpsMetadata = false;
    });

builder.Services.AddOpenIdConnectAccessTokenManagement();

builder.Services.AddControllers();

var app = builder.Build();

app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.MapControllers();
app.Run();


我正在使用Duende.AccessTokenManagementDuende.AccessTokenManagement.OpenIdConnectNuget Packages进行自动令牌管理。
然后我有一个这样的控制器:

[ApiController]
public class AuthenticationController : ControllerBase
{
    [HttpGet("hello")]
    [Authorize]
    public IActionResult Hello()
    {
        return new JsonResult("Hello");
    }
}


我可以访问和认证中间件自动重定向到微软登录页面。登录后,提供了一个令牌,但重定向到我的重定向URL似乎是重定向URL和hello端点之间的一个无休止的循环,在几次请求后,它被错误打破:

Correlation failed

piv4azn7

piv4azn71#

这将是一个cookie not sticking问题。网站后台使用临时cookie,例如存储状态和PKCE验证器,以便在登录前后使用。我也会更新这些设置,以匹配主要的身份验证cookie。使用samesite strict是首选设置,具有最佳CSRF保护。

options.NonceCookie.SameSite = SameSiteMode.Strict;
options.CorrelationCookie.SameSite = SameSiteMode.Strict;

字符串
接下来,您需要在浏览器工具中查看网络请求。使用Chrome中的preserve log选项,这将使您能够查看此表单的网站请求。查看提供了哪些cookie请求标头,并查看它们是否与重定向之前的set-cookie响应标头匹配。如果问题仍然存在,请将这些详细信息添加到问题中。

https://localhost/signin-oidc?code=xxx&state=yyy


这通常是解决重定向循环问题的最佳方法。另一个可能的原因是cookie解密,尽管看起来您使用的是默认的DPAPI设置,所以我怀疑这是原因。

SPA注意事项

您正在使用网站安全解决方案,这可能不是SPA的最佳选择,正如derisen所示。网站突然重定向没有cookie的静态内容请求,或者当cookie过期时。您可能会发现BFF示例提供了一个API驱动的解决方案,使SPA能够更好地控制重定向和其他行为,例如当访问令牌过期时。

相关问题