gpt4 book ai didi

asp.net-core-mvc - 来自身份服务器 4 的重定向 url 未按预期运行,出现 "Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken"错误

转载 作者:行者123 更新时间:2023-12-01 16:06:12 26 4
gpt4 key购买 nike

注意:解决重定向问题后,我遇到了另一个问题,即出现错误“无法将 Newtonsoft.Json.Linq.JArray 转换为 Newtonsoft.Json.Linq.JToken”。因此,在我的回答中,我为两者提供了正确的解决方案。

我有身份服务器项目和客户端项目,一切都可以进行身份​​验证,没有任何问题,甚至它重定向到正确的客户端 URL,但 URL ex:“https://localhost:44309/signin-oidc”给出了空白页面。

注意:为身份服务器和客户端应用程序启用了 SSL。

它正在按预期对用户进行身份验证,如下面的屏幕截图所示。 enter image description here我的身份服务器包含以下客户端配置值。

                // OpenID Connect hybrid flow and client credentials client (MVC)
new Client
{
ClientId = "mvc",
ClientName = "MVC Client",
AllowedGrantTypes = GrantTypes.HybridAndClientCredentials,
ClientSecrets =
{
new Secret("secret".Sha256())
},

RedirectUris = { /*"http://localhost:5002/signin-oidc",*/"https://localhost:44309/signin-oidc" },
PostLogoutRedirectUris = { /*"http://localhost:5002/signout-callback-oidc",*/"https://localhost:44309/signout-callback-oidc" },

AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
//"api1"
},
AllowOfflineAccess = true
}

startup.cs如下。

        public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

// configure identity server with in-memory stores, keys, clients and scopes
services.AddIdentityServer()
.AddDeveloperSigningCredential()
.AddInMemoryIdentityResources(Config.GetIdentityResources())
.AddInMemoryApiResources(Config.GetApiResources())
.AddInMemoryClients(Config.GetClients())
.AddTestUsers(Config.GetUsers());

services.AddAuthentication()
//.AddGoogle("Google", options =>
//{
// options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

// options.ClientId = "434483408261-55tc8n0cs4ff1fe21ea8df2o443v2iuc.apps.googleusercontent.com";
// options.ClientSecret = "3gcoTrEDPPJ0ukn_aYYT6PWo";
//})
.AddOpenIdConnect("oidc", "dataVail Login", options =>
{
options.SignInScheme = IdentityServerConstants.ExternalCookieAuthenticationScheme;

options.SignOutScheme = IdentityServerConstants.SignoutScheme;

options.Authority = "https://login.microsoftonline.com/d0e2ebcc-0961-45b2-afae-b9ed6728ead7";//"https://demo.identityserver.io/";
options.ClientId = "f08cc131-72da-4831-b19d-e008024645e4";
options.UseTokenLifetime = true;
options.CallbackPath = "/signin-oidc";
options.RequireHttpsMetadata = false;

options.TokenValidationParameters = new TokenValidationParameters
{
NameClaimType = "name",
RoleClaimType = "role"
};
});
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}

app.UseForwardedHeaders(new ForwardedHeadersOptions
{
ForwardedHeaders = ForwardedHeaders.XForwardedFor | ForwardedHeaders.XForwardedProto
});

app.Use(async (context, next) =>
{
context.Request.Scheme = "https";
await next.Invoke();
});
app.UseIdentityServer();

app.UseStaticFiles();
app.UseMvcWithDefaultRoute();
}

这是我的客户端应用程序的startup.cs

        public void ConfigureServices(IServiceCollection services)
{
services.AddMvc();

JwtSecurityTokenHandler.DefaultInboundClaimTypeMap.Clear();

services.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies")
.AddOpenIdConnect("oidc", options =>
{
options.SignInScheme = "Cookies";

options.Authority = "https://localhost:44392/";
options.RequireHttpsMetadata = false;

options.ClientId = "mvc";
options.ClientSecret = "secret";
options.ResponseType = "code id_token";

options.SaveTokens = true;
options.GetClaimsFromUserInfoEndpoint = true;

//options.Scope.Add("api1");
options.Scope.Add("offline_access");

});
}

任何人都可以尝试帮我解决这个问题吗?

最佳答案

我可以在 Identity Server 4 人员的帮助下解决这个问题。如果有人遇到这个问题,这里就是解决方案。

我错过了在配置客户端 MVC 管道中添加“UseAuthentication”。因此,在添加后,我按预期重定向,然后我遇到了另一个问题,如下所示。

System.InvalidCastException: Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken. at Microsoft.AspNetCore.Authentication.RemoteAuthenticationHandler1.d__12.MoveNext()
--- End of stack trace from previous location where exception was thrown ---
at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task)
at System.Runtime.CompilerServices.TaskAwaiter1.GetResult() at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.<Invoke>d__6.MoveNext() --- End of stack trace from previous location where exception was thrown --- at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw() at System.Runtime.CompilerServices.TaskAwaiter.HandleNonSuccessAndDebuggerNotification(Task task) at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.<Invoke>d__7.MoveNext()

我在使用 AzureAD 作为外部身份验证提供程序将我的应用程序连接到 IdentityServer4 时遇到此异常。我的应用程序使用混合流连接到 IdentityServer4。我已正确重定向到 Azure、登录、代码和 id_tokens 已正确颁发。当调用 userInfo 端点时,我的应用程序中会引发此异常。

为了解决这个问题,我必须删除该名称两次的声明。

我确认 AAD 发送了两个姓名声明。删除其中一个即可解决问题。

var namesClaim = externalUser.FindFirst(ClaimTypes.Name) ??
throw new Exception("Unknown names");

if (namesClaim!=null)
{
claims.Remove(namesClaim);
}

希望这可以帮助某人。

关于asp.net-core-mvc - 来自身份服务器 4 的重定向 url 未按预期运行,出现 "Cannot cast Newtonsoft.Json.Linq.JArray to Newtonsoft.Json.Linq.JToken"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50452990/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com