MSAL 适用于非 SPA?服务器端身份验证?

问题描述 投票:0回答:1

我是 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 身份验证方面没有找到太多信息。也许我看错了方向。如果相关,也请让我知道任何参考资料。谢谢你。

authentication azure-active-directory single-sign-on msal
1个回答
0
投票

要使用 Azure Active Directory/Microsoft Entra IDAzure 单点登录 (SSO) 在传统的整体式非 SPA 应用程序中实现身份验证,您确实仍然可以使用 Microsoft 身份验证库 (MSAL)

  • 由于 Flask 是服务器端,您的后端将处理身份验证和令牌验证。
  • 但是,对于 Flask 这样的服务器端应用程序,您将依赖于 MSAL 的授权代码流,或者只是使用服务器上的其他库来处理令牌验证。

下面是它的实现原理:

  • 用户身份验证成功后,Microsoft Entra ID 将在 URL 查询参数中使用授权代码将用户重定向回您的应用程序。
  • 收到授权码后,服务器端(Flask)应用程序会将此授权码交换为 ID 令牌访问令牌
  • 客户端(您的前端)将收到 ID 令牌,该令牌必须包含在向您的服务器发出的任何请求的标头中。

样品:

参考更多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)

enter image description here

注意MSAL主要用于客户端处理令牌获取,但在服务器端上下文中,您可以使用 MSAL 处理令牌验证,甚至可以使用 Authorization 代表用户获取令牌代码流程.

  • 确保令牌安全地存储在服务器端(例如,在 Flask 会话中)。

参考资料:

AzureAD/microsoft-authentication-library-for-js:适用于 JS 的 Microsoft 身份验证库 (MSAL)

开发人员的 microsoft-authentication-library-for-js/lib/msal-node/docs/faq.md · AzureAD/microsoft-authentication-library-for-js

© www.soinside.com 2019 - 2024. All rights reserved.