从Microsoft身份平台获取刷新令牌

时间:2020-01-31 12:35:04

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

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

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

1 个答案:

答案 0 :(得分: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");

更新

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

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门户中配置的那个。