首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在oidc-client中验证状态和当前状态

在oidc-client中验证状态和当前状态
EN

Stack Overflow用户
提问于 2020-07-08 01:28:06
回答 2查看 4.8K关注 0票数 3

我所理解的是-oidc客户机生成当前状态并将其发送到授权服务器(标识服务器4)。这是用来防止CSRF攻击,重播攻击。

状态和nonce是通过下面的signinredirect()示例发送的

代码语言:javascript
运行
复制
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中,如下所示

代码语言:javascript
运行
复制
    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

状态必须存在于用户中。但是在我的例子中,我认为状态在回调方法中是未定义的。

代码语言:javascript
运行
复制
  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?

  • Why未定义状态之后,oidc在哪里存储
  1. ?如何在回调后检索状态?我想不是由URL(path)!
  2. Does oidc内部验证状态吗?多么?在哪里?

第2期-现在的

在id_token中接收到的值

代码语言:javascript
运行
复制
created: 1594171097
extraTokenParams: {}
id: "5cc732d3b7fe4a0abdb371be3bda69a6"
nonce: "17c3f171328b4542a282fcbdd43d6fe4"

另外,我看到有2-4个oidc用户在登录后被存储在本地存储中.为什么会这样?他们有相同的用户信息,但不同的ID和现在。在每次新的登录或刷新之后,我都会生成用户对这些信息的清除()。

问题-

  1. 为什么2-4用户信息存储在本地存储中?哪一种方法生成本地存储用户? generation?
  2. Does oidc在内部验证nonce之后,每个会话或每个用户
  3. 是否存储了nonce值?哪里?如果不是,我该怎么做呢?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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的代码摘录。

代码语言:javascript
运行
复制
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-客户端库管理。

票数 0
EN

Stack Overflow用户

发布于 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中的一些代码行

代码语言:javascript
运行
复制
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才会生成

代码语言:javascript
运行
复制
var oidc = SigninRequest.isOidc(response_type);
var code = SigninRequest.isCode(response_type);
票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62786200

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档