我所理解的是-oidc客户机生成当前状态并将其发送到授权服务器(标识服务器4)。这是用来防止CSRF攻击,重播攻击。
状态和nonce是通过下面的signinredirect()示例发送的
https://auth.azurewebsites.net/Account/Login?
ReturnUrl=%2Fconnect%2Fauthorize%2Fcallback%3F
client_id%3DLocal%26
redirect_uri%3Dhttp%253A%252F%252Flocalhost%253A4200%252Fauth-callback%252F%26
response_type%3Did_token%2520token%26
scope%3Dopenid%2520profile%2520Api%26
state%3D212ee56661074896aea2b6043d2b8a3f%26
nonce%3D393838b342d543d5910f38cbcab22fa0%26
loginType%3DInternal // my extra params问题1-回调后未定义状态
状态被添加到回调URL中,如下所示
http://localhost:4200/auth-callback#id_token=eyJhbG...
token_type=Bearer
&expires_in=300&
scope=openid%20profile%20Api&
state=155e3e4352814ca48e127547c134144e&
session_state=DPXW-ijMR4ST9iTSxgMwhsLq7aoknEZOnq3aFDooCFg.ifImJurwkwU6M5lwZXCUuw状态必须存在于用户中。但是在我的例子中,我认为状态在回调方法中是未定义的。
async completeAuthentication() {
await this.manager
.signinRedirectCallback()
.then(x => {
this.user = x;
this.user.state = x.state; // undefined
this.user.session_state = x.session_state;
})
.catch(errorData => {
const expired = errorData;
});

问题
在generation?
第2期-现在的
在id_token中接收到的值
created: 1594171097
extraTokenParams: {}
id: "5cc732d3b7fe4a0abdb371be3bda69a6"
nonce: "17c3f171328b4542a282fcbdd43d6fe4"另外,我看到有2-4个oidc用户在登录后被存储在本地存储中.为什么会这样?他们有相同的用户信息,但不同的ID和现在。在每次新的登录或刷新之后,我都会生成用户对这些信息的清除()。

问题-
发布于 2020-07-08 10:31:44
所以我已经调试了代码并找到了你的答案,
这不应重复,因此每个请求都会生成以减轻重放攻击()。
存储在会话存储中
是的,它在内部验证。你得看看oidc客户的js。我从里面提取了一些代码来清楚地看到,
Log.error("ResponseValidator._validateIdToken:(_validateIdToken,response) { if (!state.nonce) {_validateIdToken(!state.nonce){ on“);返回Promise.reject(新错误(”nonce“));} let jwt = this._joseUtil.parseJwt(response.id_token);如果(!jwt \x!Log.error("ResponseValidator._validateIdToken:_返回Promise.reject(新错误(“无效的id_token"));}
}
现在回到状态参数验证。它在用户对象中不再可用,而是在内部手动之前进行验证。下面是来自oidc-client js的代码摘录。
processSigninResponse(url, stateStore) {
Log.debug("OidcClient.processSigninResponse");
var response = new SigninResponse(url);
if (!response.state) {
Log.error("OidcClient.processSigninResponse: No state in response");
return Promise.reject(new Error("No state in response"));
}
stateStore = stateStore || this._stateStore;
return stateStore.remove(response.state).then(storedStateString => {
if (!storedStateString) {
Log.error("OidcClient.processSigninResponse: No matching state found in storage");
throw new Error("No matching state found in storage");
}
let state = SigninState.fromStorageString(storedStateString);
Log.debug("OidcClient.processSigninResponse: Received state from storage; validating response");
return this._validator.validateSigninResponse(state, response);
});
}状态和状态都由oidc-客户端库管理。
发布于 2020-08-20 05:34:58
可能有助于授权代码流+ PKCE。然而,PR仍在等待合并和发布。现在,现在只为response_type=id_token生成now。
如果我们使用的是授权代码流+ PKCE,那么当前这个库期望nonce处于状态,并与Id_token中的nonce匹配。
https://github.com/IdentityModel/oidc-client-js/pull/1121
下面是lib中的一些代码行
if (state.nonce && !response.id_token) {
_Log.Log.error("ResponseValidator._processSigninParams: Expecting id_token in response");
return Promise.reject(new Error("No id_token in response"));
}
if (!state.nonce && response.id_token) {
_Log.Log.error("ResponseValidator._processSigninParams: Not expecting id_token in response");
return Promise.reject(new Error("Unexpected id_token in response"));
}只有在隐式流的情况下,nonce才会生成
var oidc = SigninRequest.isOidc(response_type);
var code = SigninRequest.isCode(response_type);https://stackoverflow.com/questions/62786200
复制相似问题