我想实现一个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.AccessTokenManagement和Duende.AccessTokenManagement.OpenIdConnectNuget Packages进行自动令牌管理。
然后我有一个这样的控制器:
[ApiController]
public class AuthenticationController : ControllerBase
{
[HttpGet("hello")]
[Authorize]
public IActionResult Hello()
{
return new JsonResult("Hello");
}
}
型
我可以访问和认证中间件自动重定向到微软登录页面。登录后,提供了一个令牌,但重定向到我的重定向URL似乎是重定向URL和hello端点之间的一个无休止的循环,在几次请求后,它被错误打破:
Correlation failed
型
1条答案
按热度按时间piv4azn71#
这将是一个
cookie not sticking
问题。网站后台使用临时cookie,例如存储状态和PKCE验证器,以便在登录前后使用。我也会更新这些设置,以匹配主要的身份验证cookie。使用samesite strict是首选设置,具有最佳CSRF保护。字符串
接下来,您需要在浏览器工具中查看网络请求。使用Chrome中的
preserve log
选项,这将使您能够查看此表单的网站请求。查看提供了哪些cookie
请求标头,并查看它们是否与重定向之前的set-cookie
响应标头匹配。如果问题仍然存在,请将这些详细信息添加到问题中。型
这通常是解决重定向循环问题的最佳方法。另一个可能的原因是cookie解密,尽管看起来您使用的是默认的DPAPI设置,所以我怀疑这是原因。
SPA注意事项
您正在使用网站安全解决方案,这可能不是SPA的最佳选择,正如
derisen
所示。网站突然重定向没有cookie的静态内容请求,或者当cookie过期时。您可能会发现BFF示例提供了一个API驱动的解决方案,使SPA能够更好地控制重定向和其他行为,例如当访问令牌过期时。