如何解决如何使用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 举报,一经查实,本站将立刻删除。