我们有一个带有 Azure oauth2 身份验证的浏览器应用程序(js 单页应用程序),还使用 ​​rest api 连接到后端服务器。当前实现的工作方式如下:

  • 首页有SSO Login按钮
  • 浏览器应用程序调用https://login.microsoftonline.com/$tenantId/oauth2/v2.0/authorize?client_id=$appId&response_mode=fragment&response_type=code&scope=email openid profile offline_access&redirect_uri=https://appurl&code_challenge=..&..以启动 Azure 登录过程。
  • (Azure 特定的重定向和网页用于选择帐户)
  • Azure 重定向回应用程序https://appurl#code=ABC..&client_info=..&..
  • https://login.microsoftonline.com/$tenantId/oauth2/v2.0/token应用程序使用有效载荷执行 POSTclient_id=$appId&redirect_uri=https://appurl&code=ABC..&code_verifier=..&grant_type=authorization_code&..
  • access_token, id_token响应包含一个带字段的 JSON

id_token应用程序将值按原样发送到/rest/login后端。

  • 令牌在后端进行验证signature key from azure, expiry, audience, issuer
  • sub,name,email,roles[]从令牌中读取字段。
  • 创建一个内部会话标识符并将 json 返回给客户端 js 应用程序。
  • 客户端在 REST 请求中使用会话标识符作为Authorization: Bearer xxAppSessionIdxx
  • 此时,id_token由于我们知道用户+角色的值,因此我们忘记了 Azure。

客户问我们该把clientSecret值放在哪里,它在 Azure 应用注册页面中可用。我们不使用它。

问题我们应该在哪里使用它?尝试阅读文档,它没有完全回答这个问题,有些页面说clientSecret should not be used in SPA apps as the value is not really secret anymore in javascript browser apps

我们目前的系统是否不够安全?应该怎样做才能让它变得更好?

  • 客户端今天发出第一个 oauth 授权请求
  • 客户端将值发送#id_code=ABC..到后端
  • 后端执行 Azure/oauth2/v2.0/token请求将“乱码”代码转换为 id_token jwt 值,今天这发生在客户端应用程序中。
  • 创建一个内部会话标识符并将 json 返回给客户端 js 应用程序。

是否有 Azure 应用设置来强制clientSecret使用,以便没有人能够/oauth2/v2.0/token在没有它的情况下调用?此值保留在后端,因此很难仅通过检查浏览器网络选项卡来猜测。

2

  • 1
    鉴于clientSecret在这种情况下不需要这样做,您可能需要说明您的“客户”为什么要使用它。


    – 

  • @GregAskew 我的理解是他们认为这对于安全至关重要。在回答任何问题之前,我希望对整个情况有一个良好的了解。


    – 

0