【问题标题】:Getting refresh token from Microsoft Identity Platform从 Microsoft 身份平台获取刷新令牌
【发布时间】:2020-01-31 12:35:04
【问题描述】:

我有一个 Azure Web 应用程序,我希望用户在其中登录 Microsoft (Azure AD)。我需要获取刷新令牌。我已经查看了使用在后台静默刷新令牌的库的示例,但对于我的设计,我需要掌握刷新令牌本身。

这是否可以通过高级身份验证库(OpenID Connect?)来实现,如果可以,如何实现? 对于手动方法,此处描述:https://docs.microsoft.com/en-us/graph/auth-v2-user 在 ASP.NET 或 .NET Core 中是否有任何示例代码或教程?

【问题讨论】:

    标签: asp.net-mvc asp.net-core azure-active-directory azure-web-app-service refresh-token


    【解决方案1】:

    首先,我建议使用MSAL,它维护令牌缓存并在令牌即将到期时为您刷新令牌。您无需自行处理令牌过期问题。

    如果要持有刷新令牌,可以在注册OIDC中间件时将SaveTokens属性设置为true,这样令牌就会保存到cookie中。我假设您正在使用Microsoft.AspNetCore.Authentication.AzureAD.UI 库:

    services.AddAuthentication(AzureADDefaults.AuthenticationScheme)
        .AddAzureAD(options => Configuration.Bind("AzureAd", options));
    
    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
    {
        options.Authority = options.Authority + "/v2.0/";
        options.SaveTokens = true;
    
    
    });
    

    然后您可以访问控制器中的令牌,例如:

    var refreshToken = await HttpContext.GetTokenAsync("refresh_token");
    var idToken = await HttpContext.GetTokenAsync("id_token");
    

    更新:

    那是因为你没有正确获得刷新令牌。对于测试,您可以使用代码流并添加offline_access OIDC 范围:

    services.Configure<OpenIdConnectOptions>(AzureADDefaults.OpenIdScheme, options =>
    {
        options.Authority = options.Authority + "/v2.0/";
        options.SaveTokens = true;
        options.ResponseType = "code";
        options.ClientSecret = "xxxxxx";
        options.Scope.Add("offline_access");
        options.TokenValidationParameters.ValidateIssuer = false;
    
    });
    

    ClientSecret 替换为您在 Azure 门户中配置的那个。

    【讨论】:

    • 我在添加了身份验证并使用 Microsoft.AspNetCore.Authentication.AzureAD.UI 的新 MVC Web 应用程序(.NET Framework、ASP.NET Core 2.2)中进行了尝试。我也必须参考 Microsoft.AspNetCore.Authentication 才能使用 GetTokenAsync。我将代码放在 HomeController 中,希望它能够正确实现。只有“id_token”返回了一个值,而“refresh_token”为空。我也尝试获取“access_token”,它也是空的。
    • 我收到关联错误 - 位置未知,或者仍然无法获取令牌。不过,我可能会阅读更多关于 MSAL 的内容。顺便提一句。项目默认是 services.Configure...,但按照您的描述进行了更改。
    • 我没有设置CookiePolicyOptions
    • 好的。我去看看。感谢您的建议!是的,CookiePolicyOptions 只是创建项目时的默认设置。
    猜你喜欢
    • 1970-01-01
    • 2019-10-26
    • 1970-01-01
    • 1970-01-01
    • 2020-08-05
    • 1970-01-01
    • 2017-11-08
    • 2021-12-24
    • 1970-01-01
    相关资源
    最近更新 更多