以前,我可以这样做来注销我的应用程序:

public async Task<bool> SignOut()
{
    var accounts = await PublicClientApp.GetAccountsAsync();
    if (accounts.Any())
    {
        try
        {
            await PublicClientApp.RemoveAsync(accounts.FirstOrDefault());
            return true;
        }
        catch (MsalException ex)
        {
            _logger.Error(ex);
            Console.WriteLine("SignOut: See error log.");
            return false;
        }
    }

    return false;
}

我现在用的是DeviceCodeCredential.AuthenticationRecord.现在没有account了.

用户触发注销的最简单方法是什么?

推荐答案

要以编程方式注销Azure身份应用程序,您可以使用以下端点:

https://login.microsoftonline.com/TenantID/oauth2/logout?client_id=ClientID&post_logout_redirect_uri=RedirectURL

配置多租户应用程序后,需要将TenantID传递为100

https://login.microsoftonline.com/common/oauth2/logout?client_id=ClientID&post_logout_redirect_uri=https://jwt.ms

enter image description here

enter image description here

即使在注销后,没有删除令牌文件,您也会出现此错误"您已注销您的帐户".我还可以登录Outlook.所以这是一件大事.但我的令牌仍然有效,所以当我第二次运行我的应用程序时,它仍然工作"因为令牌有效

此问题通常发生在令牌仍然有效的情况下,因此您需要清除令牌缓存,即当用户注销时,您应该从令牌缓存中删除与该用户关联的令牌.所有与用户相关的令牌缓存必须使用注销URL清除,然后它才能正常工作.

因此,首先try 删除令牌文件,然后注销用户,用户将成功注销.

public static void SignOut()  
{  
    // Ensure settings isn't null  
    _ = _settings ?? throw new System.NullReferenceException("The variable '_settings' should not be null");  
      
    // Delete the token cache file.  
    if (Path.Exists(Program.OutlookOptions.TokenCachePath))  
    {  
        File.Delete(Program.OutlookOptions.TokenCachePath);  
    }  
  
    // Logout  
    string url = 
      string.Format("https://login.microsoftonline.com/common/oauth2/logout?client_id={0}", _settings.ClientId);  
    OpenUrl(url);  
}  

Reference:

How to open in default browser in C#

Csharp相关问答推荐

PredicateBuilder不是循环工作,而是手动工作

EF Core Fluent API中定义的多对多关系

react 式扩展连接中的非交叉LeftDurationTimeout

在C#中使用in修饰符

. NET WireMock拒绝PostAsJsonAsync序列化

将XPS转换为PDF C#

ASP.NET核心REST API返回一个非常大的数字

如何从ASP.NET核心MVC视图和Blazor传递数据

在静态模式下实例化配置

TCPClient阅读流

如何在Cosmos SDK中控制超时、重试和重试之间的延迟?

将类移动到新命名空间后更新RavenDB Raven-Clr-Type

JsonSchema.Net删除假阳性判断结果

C#按名称从类获取属性值类型<;t>;,我需要反射吗?

为什么我的伺服电机不动,下面的代码?

如何实现有条件的自定义Json转换器隐藏属性

如何消除Visual Studio错误,因为它不识别集合表达式的新C#12语法?

Xamarin.Forms中具有类似AspectFill的图像zoom 的水平滚动视图

当要删除的子模型没有父模型的1:多属性时,如何告诉实体框架设置1:1 FK条目?

项目参考和方法签名问题