如何使用Azure Active Directory刷新web应用程序中的访问令牌

如何使用Azure Active Directory刷新web应用程序中的访问令牌,azure,authentication,azure-active-directory,access-token,refresh-token,Azure,Authentication,Azure Active Directory,Access Token,Refresh Token,我目前正挣扎于访问令牌的生命周期。我有dotnet核心Web应用程序和dotnet核心Web API web应用程序受OpenIDConnect授权的保护。一旦您尝试连接到web app,您将被重定向到Microsoft登录表单,成功登录后,访问令牌将与刷新令牌一起提供并存储到cookie中 因此,访问令牌在我的WebAPI请求的授权头中传递。 当访问令牌生存期到期时,我的WebAPI开始返回401 Unauthorized 我读了很多关于使用刷新令牌撤销访问令牌的文章,但我没有找到任何实现示例

我目前正挣扎于访问令牌的生命周期。我有dotnet核心Web应用程序和dotnet核心Web API

web应用程序受OpenIDConnect授权的保护。一旦您尝试连接到web app,您将被重定向到Microsoft登录表单,成功登录后,访问令牌将与刷新令牌一起提供并存储到cookie中

因此,访问令牌在我的WebAPI请求的授权头中传递。 当访问令牌生存期到期时,我的WebAPI开始返回401 Unauthorized

我读了很多关于使用刷新令牌撤销访问令牌的文章,但我没有找到任何实现示例,所以我转向你们

这就是我在Web客户端中设置OpenId的方式。

        services.AddDataProtection();
        services.AddAuthorization();
        services.AddWebEncoders();
        services.AddAuthentication(sharedOptions =>
        {
            sharedOptions.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            sharedOptions.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
        })
        .AddCookie(CookieAuthenticationDefaults.AuthenticationScheme)
        .AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
        {
            options.SignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
            options.ClientId = Configuration["AzureAd:ClientId"];
            options.Authority = $"{Configuration["AzureAd:AadInstance"]}{Configuration["AzureAd:Tenant"]}/v2.0";
            options.ClientSecret = Configuration["AzureAd:ClientSecret"];
            options.ResponseType = "code";
            options.SaveTokens = true;
            options.UseTokenLifetime = true;
            
            options.Scope.Add(Configuration["AzureAd:Scope"]);

            options.TokenValidationParameters = new TokenValidationParameters()
            {
                ValidateIssuer = Configuration["AzureAd:Tenant"] != "common",
                RoleClaimType = JwtClaimTypes.Role
            };
            options.Events = new OpenIdConnectEvents
            {
                OnRemoteFailure = context =>
                {
                    context.HandleResponse();
                    context.Response.Redirect("/error");
                    return Task.CompletedTask;
                }
            };
        });

        services.AddHttpContextAccessor();
这就是我在Web API Startup.cs中设置身份验证的方式

            services.AddAuthentication("Bearer")
            .AddJwtBearer(
                "Bearer",
                options =>
                {
                    options.Authority = $"{Configuration["AzureAd:AadInstance"]}{Configuration["AzureAd:Tenant"]}/v2.0";
                    options.Audience = Configuration["AzureAd:Audience"];
                    options.TokenValidationParameters.ValidateIssuer = false;
                });
最后,这是我的ApiService的构造器,在这里我将访问令牌添加到头中

    protected ApiService(HttpClient httpClient, string apiUri, IHttpContextAccessor httpContextAccessor, ILogger<ApiService> logger)
    {
        this.httpClient = httpClient;
        this.apiUri = apiUri;
        this.logger = logger;
        context = httpContextAccessor.HttpContext;

        this.httpClient.DefaultRequestHeaders.Authorization
            = new AuthenticationHeaderValue("Bearer", context.GetTokenAsync("access_token").Result);
    }
受保护的API服务(HttpClient HttpClient、字符串API URI、IHttpContextAccessor httpContextAccessor、ILogger记录器)
{
this.httpClient=httpClient;
this.apiUri=apiUri;
this.logger=记录器;
context=httpContextAccessor.HttpContext;
this.httpClient.DefaultRequestHeaders.Authorization
=新的AuthenticationHeaderValue(“承载者”,context.GetTokenAsync(“访问令牌”).Result);
}

如果你需要更多的信息,告诉我,我会提供的。谢谢大家!

正如我现在所理解的,您拥有基本的ASP.NET核心Web应用程序(MVC或Razor),并且希望通过Azure AD来保护它

如果我的理解正确,您应该利用Microsoft.Identity.Web库:

它目前仍在预览中,但我可以确认它工作稳定。 以下是如何将其与ASP.NET核心web应用程序集成的详细说明:

以下是样本:

此库还管理刷新令牌并提供令牌缓存实现,因此您无需自行实现:

在初创企业中重新编程身份验证并利用iTokenAcquisitor服务解决我的问题:

请正确理解:首先-您从ASP.NET Core Web应用程序调用ASP.NET Core Web API。第二个问题-您想为特定用户撤销刷新令牌正确吗?1)正确2)我想通过使用刷新令牌(授权代码流原则)撤销访问令牌,但经过几次搜索后,这似乎是一个内置函数。所以我不确定这是否能解决我的问题。@DanielRusnok我编辑了标题以反映您的评论,如果可以,请随意更改incorrect@DanielRusnok确实如此,但从我们现在的讨论来看,我认为您的问题的答案是:您可以使用MSAL刷新令牌。也检查一下这个-这是解释:谢谢。但不完全是我的意思。好吧,听到这个消息我很难过。我以为我们正在讨论Azure广告中的刷新令牌撤销。我将尝试进一步解释它。对不起,这是我的英语,这主要是破坏我的沟通技巧。我有Web Api和Web客户端应用程序(Dotvvm框架)。我的问题是,有时Web Api在使用客户端应用程序一段时间后返回401拒绝访问。我认为这是因为访问令牌过期。现在唯一的解决方案是注销并登录到应用程序并获取新的访问令牌。我想通过使用刷新令牌“幕后”静默地获取新的访问令牌,但我不知道如何获取,因为我找不到任何代码示例。我认为这种行为是内置的,我猜我的设置是错误的。或者,我应该使用SecretentialClientApplication类以某种方式访问访问令牌并续订它吗?