当前位置: 首页 > 知识库问答 >
问题:

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

程化
2023-03-14

我目前正在与访问令牌的生存期作斗争。我有dotnet核心Web应用程序和dotnet核心Web API。

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

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

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

        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();
            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);
    }

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

共有1个答案

闻人飞白
2023-03-14

正如我现在所指出的,您拥有基本的ASP.NET核心Web应用程序(MVC,或Razor),并且希望使用Azure Ad来保护它。

如果我的理解是正确的,您应该利用Microsoft.Identity.web库:https://github.com/azuread/microsoft-identity-web

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

 类似资料:
  • 我正在使用Cognito用户池对系统中的用户进行身份验证。成功的身份验证将提供一个ID令牌(JWT)、一个访问令牌(JWT)和一个刷新令牌。这里的文档清楚地提到了刷新令牌可以用于刷新访问令牌,但没有提到如何使用。我的问题是,一旦我的访问令牌过期,我如何使用存储的刷新令牌再次刷新我的访问令牌? 我搜索了JavaScript SDK,但找不到任何方法来做同样的事情。我肯定错过了什么。 我还想通过Lam

  • 我面临一个问题,以刷新谷歌访问令牌在服务器端。 我从谷歌认证服务器得到的响应只是403状态代码。信息是这样的 仅仅为了刷新访问令牌,在我的服务器上使用SSL是强制性的吗?它已经在我的本地服务器上测试过,没有附加任何SSL到它。

  • 我需要在Spring Boot应用程序的服务层中获得访问令牌(grant_type=client_credentials),以便与其他微服务对话(服务到服务的交互)。这一层没有spring http会话或auth,我只有client_id、client_secret和令牌URL。这些属性在Application.properties中设置为: 这在Spring Security OAuth中似乎很

  • 目前访问类型处于联机状态。当我需要访问驱动器上的文件/文件夹时,我将浏览器重定向到Google URL并获得访问代码: 一切运转良好!但我只需要第一次重定向。 当我谷歌时,在google Drive API文档中,我发现我可以通过浏览器重定向获得刷新令牌,并将其保存在数据库中。(换句话说,我可以使用脱机访问)。 而且每次当我需要从google drive读取数据时,我使用刷新令牌获得访问令牌,而无

  • 我有一个。NET应用程序,正在使用谷歌驱动器访问用户的文件。我能够获得授权代码,并且能够通过AccessToken和RefreshToken交换授权代码。问题是我无法刷新访问令牌,它在一小时后过期。 请指教。谢了。 请注意,使用此代码,我能够获得访问令牌。只是我希望这段代码在Google API中。