微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

我目前正在努力解决访问令牌的生命周期。我有dotnet核心Web应用程序和dotnet核心Web API。

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

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

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

这是我在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);
    }

如果您需要其他信息,请告诉我,我会提供。谢谢!

解决方法

我现在不了解-您具有基本的ASP .NET Core Web应用程序(MVC或Razor),并且您希望使用Azure AD保护它。

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

它目前仍在预览中,但我可以确认它是否稳定。 以下是有关如何将其与ASP .NET Core Web应用集成的详细说明: https://github.com/AzureAD/microsoft-identity-web/wiki/web-apps

以下是示例: https://github.com/AzureAD/microsoft-identity-web/wiki/web-app-samples

此库还管理刷新令牌并提供令牌缓存实现,因此您不必自己实现它: https://github.com/AzureAD/microsoft-identity-web/issues/221

,

在Startups中重新编程身份验证并利用ITokenAcquirer服务解决了我的问题:https://github.com/Azure-Samples/active-directory-aspnetcore-webapp-openidconnect-v2/tree/master/4-WebApp-your-API/4-1-MyOrg

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。