我正在开发受传统openid连接服务器保护的Web端点,
客户端网站(startup.cs
)上的配置如下:
app.UseOpenIdConnectAuthentication(new OpenIdConnectOptions
{
AuthenticationScheme = "oidc",
SignInScheme = "Cookies",
ClientId = "client1",
GetClaimsFromUserInfoEndpoint = false,
ProtocolValidator = new OpenIdConnectProtocolValidator() {
RequireStateValidation=false, RequireState=false },
ResponseType = "token id_token",
ResponseMode= OpenIdConnectResponseMode.Fragment,
Configuration = new OpenIdConnectConfiguration() {
AuthorizationEndpoint = "https://server/oauth/v2/authorize" },
RequireHttpsMetadata = false,
SaveTokens = false
});
我不得不将response_type
设置为令牌id_token
。
在请求受[Authorize]
属性保护的端点后,我正确地被重定向到授权服务器,授权服务器为用户提供登录表单。
用户登录后,授权服务器会向客户网站返回302
,并附加包含access
令牌和id
令牌的片段。
示例:
https://localhost:44341/signin-oidc#access_token=384b1c07-4a59-41e3-894f-266e46680f0c
&expires_in=3600
&token_type=Bearer
&id_token=<random_jwt>
&id_token_type=urn%3Aietf%3Aparams%3Aoauth%3Agrant-type%3Ajwt-bearer
&state=CfDJ8JU8TffTfA9Jnq6JVvmsltccnGVaA_IX4LQhGjz_n3f0NMqSBfcdctjtUAtDpCN7F4Wy9pqq8ikQo-KVpaQlOnOwPpqZWUDWfKeLvOeFQ9-GI6eq1RbE_13Hrtdwm1Ijy0N7nwmbuO47uK_Zg0NfzcfngHVvfUB0ccrAAE79EcKVaiuXXcwCQwtflsp1kFdCou4aJVY9zo2-w_wwTJpEuyw_c-WulPD3bY8ZQLiGpmt8Wao9VQsBmOBoMB-zCBf9o4ot2jloyqpnXamOx6mCFvWizxILvXVH1pbYEc58SFRKe4MSW3png8xSqTdN1gZ6iKBy6BPtq_v5XLsbL68cCng
&scope=openid
我从openidconnect中间件(Web客户端)收到错误说:
OpenIdConnectAuthenticationHandler:message.State为null或为空。 AggregateException:未处理的远程故障。 ... (OpenIdConnectAuthenticationHandler:message.State为null或 空。)
错误很明显,它确实找不到状态参数,因为它不再存在于查询字符串中,而是存在于片段上。但是我明确地将其设置为期望片段中的响应。即使这不起作用,我也设置了跳过状态验证的选项,但它也没有工作。
我错过了什么?