如何在 Asp.Net 和 Asp.Net 核心应用程序之间共享 access_token
How to get the access_token shared between Asp.Net and Asp.Net Core applications
我正在使用 Identity Server 4 提供对多个应用程序的访问,其中一些是 Asp.Net 核心,一些是经典 Asp.Net(MVC 和 WebForms)。
由于旧的 WebForms 应用程序的设计,应用程序需要共享它们的 cookie(基本上 API 是 'in' Web 应用程序,因此它受到 Web 应用程序基于 cookie 的身份验证的保护).我正在使用数据保护来实现 cookie 共享,但这会产生一个单独的问题。
如果我通过核心应用程序登录,然后导航到 WebForms 应用程序,我不知道如何让 access_token 调用其他 APIs。
在核心应用程序中,我可以从 HttpContext 中检索它:
_httpContextAccessor.HttpContext.GetTokenAsync(AuthConstants.AccessToken).Result
在 WebForms 中获取 access_token 的等效方法是什么?
对于上下文,这是我的核心应用程序身份验证配置:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services
.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Cookie = new CookieBuilder
{
Domain = configuration.CookieDomain,
HttpOnly = configuration.CookieHttpOnly,
Name = configuration.CookieName
};
options.ExpireTimeSpan = configuration.AuthTimeout;
options.SlidingExpiration = configuration.AllowSlidingAuthTimeout;
options.DataProtectionProvider = DataProtectionProvider.Create
(
new DirectoryInfo(configuration.DataProtectionKeyDirectory)
);
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = configuration.AuthorizationServerUri;
options.RequireHttpsMetadata = configuration.RequireHttps;
options.ClientId = configuration.Client;
options.ClientSecret = configuration.Secret;
options.ResponseType = configuration.ResponseType;
options.Scope.Clear();
foreach (var resource in configuration.Scope.Split(" "))
options.Scope.Add(resource);
options.SignedOutRedirectUri = configuration.RedirectUri;
options.UseTokenLifetime = configuration.UseAuthServerLifetime;
options.SaveTokens = true;
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = JwtClaimTypes.Name,
RoleClaimType = JwtClaimTypes.Role
};
});
只是为了解决这个问题,我没有找到我正在寻找的答案,最终将 API 分离到它自己的服务中,就像最初应该做的那样。这使这个问题无效。
我正在使用 Identity Server 4 提供对多个应用程序的访问,其中一些是 Asp.Net 核心,一些是经典 Asp.Net(MVC 和 WebForms)。
由于旧的 WebForms 应用程序的设计,应用程序需要共享它们的 cookie(基本上 API 是 'in' Web 应用程序,因此它受到 Web 应用程序基于 cookie 的身份验证的保护).我正在使用数据保护来实现 cookie 共享,但这会产生一个单独的问题。
如果我通过核心应用程序登录,然后导航到 WebForms 应用程序,我不知道如何让 access_token 调用其他 APIs。
在核心应用程序中,我可以从 HttpContext 中检索它:
_httpContextAccessor.HttpContext.GetTokenAsync(AuthConstants.AccessToken).Result
在 WebForms 中获取 access_token 的等效方法是什么?
对于上下文,这是我的核心应用程序身份验证配置:
JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();
services
.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
})
.AddCookie(CookieAuthenticationDefaults.AuthenticationScheme, options =>
{
options.Cookie = new CookieBuilder
{
Domain = configuration.CookieDomain,
HttpOnly = configuration.CookieHttpOnly,
Name = configuration.CookieName
};
options.ExpireTimeSpan = configuration.AuthTimeout;
options.SlidingExpiration = configuration.AllowSlidingAuthTimeout;
options.DataProtectionProvider = DataProtectionProvider.Create
(
new DirectoryInfo(configuration.DataProtectionKeyDirectory)
);
})
.AddOpenIdConnect(OpenIdConnectDefaults.AuthenticationScheme, options =>
{
options.Authority = configuration.AuthorizationServerUri;
options.RequireHttpsMetadata = configuration.RequireHttps;
options.ClientId = configuration.Client;
options.ClientSecret = configuration.Secret;
options.ResponseType = configuration.ResponseType;
options.Scope.Clear();
foreach (var resource in configuration.Scope.Split(" "))
options.Scope.Add(resource);
options.SignedOutRedirectUri = configuration.RedirectUri;
options.UseTokenLifetime = configuration.UseAuthServerLifetime;
options.SaveTokens = true;
options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = JwtClaimTypes.Name,
RoleClaimType = JwtClaimTypes.Role
};
});
只是为了解决这个问题,我没有找到我正在寻找的答案,最终将 API 分离到它自己的服务中,就像最初应该做的那样。这使这个问题无效。