我是 Azure 新手,请耐心等待。我公司的大多数内部应用程序都使用 Azure Active Directory 和 Azure SSO。大多数应用程序都是使用 AWS S3 上的 React 作为前端,使用 AWS Lambda 作为后端来构建的。通过 React,我们使用 MSAL 进行客户端 SSO 身份验证,并且只需注册 Azure 应用程序(使用用户组)即可进行前端和后端授权/用户控制。
我的团队即将开始一个新项目。我们希望坚持使用类似的身份验证机制,但问题是我们正在构建传统的整体式非 SPA 应用程序(可能使用 Flask 并在 Docker 容器中运行)。应用程序仍会将用户重定向到 Azure SSO 进行身份验证,但服务器端必须知道 ID 令牌(?),因为前端需要向服务器发出 AJAX 请求。
对于我的非 SPA 应用程序,身份验证如何进行?我需要做什么来实现这个?我是否仍应使用 MSAL 来达到此目的?或者我应该使用其他东西?按照一些教程,我已经向正确的用户组注册了 Azure 应用程序,尽管我可能没有配置任何用于 SSO 的选项。服务器代码如何与 Azure 应用程序交互以对用户进行身份验证和验证?
很抱歉,我有使用传统服务器身份验证方式构建应用程序的背景,我可能没有很好地掌握 Azure SSO 的概念。非常感谢您的帮助。所有供参考的代码片段对我来说都是有用的。
尽管我之前已经在 Google 上进行了一些查找,但我认为我在非 SPA 身份验证方面没有找到太多信息。也许我看错了方向。如果相关,也请让我知道任何参考资料。谢谢你。
要使用 Azure Active Directory/Microsoft Entra ID 和 Azure 单点登录 (SSO) 在传统的整体式非 SPA 应用程序中实现身份验证,您确实仍然可以使用 Microsoft 身份验证库 (MSAL)
下面是它的实现原理:
样品:
参考更多MsDoc
from flask import Flask, redirect, session, request, url_for
import msal
import os
app = Flask(__name__)
app.secret_key = os.urandom(24)
app.config['SESSION_TYPE'] = 'filesystem'
CLIENT_ID = 'your-client-id'
CLIENT_SECRET = 'your-client-secret'
AUTHORITY = 'https://login.microsoftonline.com/your-tenant-id'
REDIRECT_URI = 'http://localhost:5000/getAToken'
SCOPE = ['User.Read']
@app.route('/')
def home():
if 'id_token' in session:
return f"Hello, {session['user_name']}"
return redirect(url_for('login'))
@app.route('/login')
def login():
msal_app = msal.ConfidentialClientApplication(
CLIENT_ID,
authority=AUTHORITY,
client_credential=CLIENT_SECRET
)
auth_url = msal_app.get_authorization_request_url(
SCOPE,
redirect_uri=REDIRECT_URI
)
return redirect(auth_url)
@app.route('/getAToken')
def get_a_token():
code = request.args.get('code')
msal_app = msal.ConfidentialClientApplication(
CLIENT_ID,
authority=AUTHORITY,
client_credential=CLIENT_SECRET
)
result = msal_app.acquire_token_by_authorization_code(
code,
scopes=SCOPE,
redirect_uri=REDIRECT_URI
)
if 'id_token' in result:
session['id_token'] = result['id_token']
session['user_name'] = result['id_token_claims'].get('preferred_username')
return redirect(url_for('home'))
if __name__ == '__main__':
app.run(debug=True)
注意:MSAL主要用于客户端处理令牌获取,但在服务器端上下文中,您可以使用 MSAL 处理令牌验证,甚至可以使用 Authorization 代表用户获取令牌代码流程.
参考资料:
AzureAD/microsoft-authentication-library-for-js:适用于 JS 的 Microsoft 身份验证库 (MSAL)