如何解决使用MSAL
环境
- .NetCore 3.1客户端
- ADFS 2019 通过Microsoft.Identity.Client通过
- MSAL,版本= 4.18.0.0
我正在使用MSAL通过.NetCore桌面客户端的ROPC流(用户名/密码)直接向客户ADFS 2019实例进行身份验证。我能够在初次登录时获取IDToken和RefreshToken,然后MSAL(将RefreshToken私下保密)将在一段时间内获取新的IDToken,直到RefreshToken过期。
我的问题是,当我继续希望登录时,是否可以让ADFS发出新的RefreshToken或进行RefreshToken轮换?当前,一旦默认的480分钟过去了(在此期间正确发出了新的IDToken),对.AcquireTokenSilent()的调用将失败,并出现MsalUIRequiredException“参数'refresh_token'中的刷新令牌已过期”。
Microsoft says here,添加'aza'范围将强制进行RefreshToken更新(如果使用OAuth2.0扩展名?),但这不是我所看到的(因此被注释)。当我添加'aza'范围时,我确实在每个请求上获得了一个新的IDToken,而不是访问本地帐户缓存,但是没有新的RefreshTokens回来。我正在用ngrok查看到我ADFS实例的流量来验证这一点。
static void Main(string[] args)
{
app = PublicClientApplicationBuilder.Create("CLIENT_ID")
//.WithAuthority(AzureCloudInstance.AzurePublic,TenantId)
.WithAdfsAuthority("ADFS_URI",false)
//.WithExtraQueryParameters(new Dictionary<string,string> { {"forceRefresh","true" } })
.Build();
while (true)
{
var result = GetToken().GetAwaiter().GetResult();
Console.WriteLine($"IdTok: {ComputeSha256Hash(result.IdToken)},Exp: {result.ExpiresOn}");
Thread.Sleep(1000 * 60 * 2);
}
}
private static async Task<AuthenticationResult> GetToken()
{
var accounts = app.GetAccountsAsync().GetAwaiter().GetResult();
if (accounts == null || accounts.Count() == 0)
{
var result = app
.AcquireTokenByUsernamePassword(new string[] { "email","openid"/*,"aza"*/,"allatclaims","profile" },"TESTUSER",ConvertToSecureString("TESTPASS"))
.ExecuteAsync().GetAwaiter().GetResult();
accounts = app.GetAccountsAsync().GetAwaiter().GetResult();
}
var cachedResult = app.AcquireTokenSilent(new string[] { "email",accounts.FirstOrDefault()).ExecuteAsync().GetAwaiter().GetResult();
return cachedResult;
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。