我正在开发基于.NET 8.0的asp.net MVC项目。我的网站使用 ASP.Net Core Identity 进行用户身份验证。运行良好。
我必须连接到使用 OAuth2 授权的远程服务器。我决定使用 OpenIdConnect 来完成该任务。这个想法是仅使用 OIDC 进行远程服务器授权。并保留身份以供网站用户身份验证。
问题是登录远程服务器后Identity用户丢失了!
OIDC 设置:
builder.Services.AddIdentity<IdentityUser, IdentityRole>()
.AddEntityFrameworkStores<IdentityContext>();
builder.Services.AddHttpClient();
// Add OpenIdConnect to OAuth2
builder.Services.AddAuthentication(options =>
{
options.DefaultScheme = IdentityConstants.ApplicationScheme;
options.DefaultChallengeScheme = IdentityConstants.ExternalScheme;
})
.AddCookie("Cookies")
.AddOpenIdConnect(options =>
{
options.Authority = "https://remote_server.com/id/";
options.ClientId = "DemoClient";
options.ClientSecret = "myClient";
options.ResponseType = "code id_token";
options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;
options.Scope.Add("openid");
options.Scope.Add("profile");
options.Scope.Add("offline_access");
options.SignInScheme = IdentityConstants.ApplicationScheme;
options.Events = new OpenIdConnectEvents
{
OnUserInformationReceived = context =>
{
string rawAccessToken = context.ProtocolMessage.AccessToken;
string rawIdToken = context.ProtocolMessage.IdToken;
var handler = new JwtSecurityTokenHandler();
var accessToken = handler.ReadJwtToken(rawAccessToken);
var idToken = handler.ReadJwtToken(rawIdToken);
System.Diagnostics.Debug.Print($"access-token: {rawAccessToken}, id-token: {rawIdToken}");
return Task.CompletedTask;
},
OnAccessDenied = context =>
{
context.HandleResponse();
context.Response.Redirect("/");
return Task.CompletedTask;
},
OnSignedOutCallbackRedirect = context =>
{
context.HandleResponse();
context.Response.Redirect("/");
return Task.CompletedTask;
}
};
});
builder.Services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
var app = builder.Build();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
我读了以下文章文字
但这并不能解决我的问题。
我的问题:Identity 和 OIDC 是否可以并行使用?用于管理站点用户和角色的身份。 OIDC 用于远程服务器授权(具有单独的用户。这些是来自远程服务器的用户)
在深入探讨您的问题之前,我想澄清一下您的每个应用程序用户是否在外部服务的授权服务器上也有一个单独的用户帐户?
据我所知,您可能混淆了这一点。
您的应用程序用户根据您的 ASP.NET 身份进行身份验证,并且您的应用程序根据外部服务进行身份验证。因此,也许您需要的只是一个 httpclient,您可以使用来自 https://docs.duendesoftware.com/foss/accesstokenmanagement/
的 clientcredentialmanagement 处理程序来增强它