You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

React对接.NET Core API:AWS Cognito认证及MSAL替代工具咨询

AWS Cognito 对应 MSAL 的工具及实现方案

AWS 有直接对标 MSAL 的工具,AWS Amplify Auth 是最推荐的选择——它封装了 Cognito 的登录、令牌获取、自动刷新、令牌存储等全套逻辑,和 MSAL 的定位一致,无需自己处理底层认证流程。如果不想引入完整 Amplify 库,也可以用AWS SDK for JavaScript v3直接调用 Cognito API(但需手动管理令牌生命周期)。

下面是基于 React 前端 + .NET Core API 的完整实现步骤:

一、React 前端集成 Amplify Auth

1. 安装依赖

npm install aws-amplify @aws-amplify/ui-react

2. 配置 Amplify

在项目入口文件(如 App.js 或 index.js)中配置 Cognito 信息:

import { Amplify } from 'aws-amplify';

// 手动配置(无需 Amplify CLI)
Amplify.configure({
  Auth: {
    region: '你的Cognito区域(如us-east-1)',
    userPoolId: '你的用户池ID',
    userPoolWebClientId: '你的用户池应用客户端ID',
    mandatorySignIn: true,
    authenticationFlowType: 'USER_PASSWORD_AUTH' // 匹配你的Cognito认证流程
  }
});

3. 实现登录功能

快速用预构建组件

Amplify 提供开箱即用的登录/注册UI,几行代码搞定:

import { withAuthenticator } from '@aws-amplify/ui-react';
import '@aws-amplify/ui-react/styles.css';

function App() {
  return <div>你的应用内容</div>;
}

export default withAuthenticator(App);

自定义登录逻辑

如果需要自定义UI,直接调用 Amplify Auth API:

import { Auth } from 'aws-amplify';
import { useState } from 'react';

function LoginForm() {
  const [username, setUsername] = useState('');
  const [password, setPassword] = useState('');

  const handleLogin = async () => {
    try {
      await Auth.signIn(username, password);
      // 登录成功后自动存储令牌,后续可通过Auth API获取
      const session = await Auth.currentSession();
      const accessToken = session.getAccessToken().getJwtToken();
      localStorage.setItem('accessToken', accessToken); // 可选:手动存到本地
    } catch (err) {
      console.error('登录失败:', err.message);
    }
  };

  return (
    <div>
      <input
        type="text"
        value={username}
        onChange={(e) => setUsername(e.target.value)}
        placeholder="用户名"
      />
      <input
        type="password"
        value={password}
        onChange={(e) => setPassword(e.target.value)}
        placeholder="密码"
      />
      <button onClick={handleLogin}>登录</button>
    </div>
  );
}

export default LoginForm;

4. API 调用自动携带令牌

封装请求工具,自动在请求头加入 Authorization:

import axios from 'axios';
import { Auth } from 'aws-amplify';

const apiClient = axios.create({ baseURL: '你的.NET Core API地址' });

// 请求拦截器:自动添加令牌
apiClient.interceptors.request.use(
  async (config) => {
    const session = await Auth.currentSession();
    config.headers.Authorization = `Bearer ${session.getAccessToken().getJwtToken()}`;
    return config;
  },
  (err) => Promise.reject(err)
);

// 调用示例
apiClient.get('/api/protected-data')
  .then(res => console.log(res.data))
  .catch(err => console.error('API调用失败:', err));

Amplify 会自动处理令牌过期刷新,无需手动干预。

二、.NET Core API 验证 Cognito 令牌

1. 安装依赖

dotnet add package Microsoft.AspNetCore.Authentication.JwtBearer

2. 配置认证中间件

在 Program.cs 中添加 JWT 验证配置:

using Microsoft.AspNetCore.Authentication.JwtBearer;
using Microsoft.IdentityModel.Tokens;

var builder = WebApplication.CreateBuilder(args);

// 添加Cognito JWT认证
builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme)
  .AddJwtBearer(options => {
    options.Authority = "https://cognito-idp.{你的区域}.amazonaws.com/{你的用户池ID}";
    options.TokenValidationParameters = new TokenValidationParameters {
      ValidateIssuer = true,
      ValidIssuer = "https://cognito-idp.{你的区域}.amazonaws.com/{你的用户池ID}",
      ValidateAudience = true,
      ValidAudience = "你的用户池应用客户端ID", // 匹配前端使用的客户端ID
      ValidateLifetime = true
    };
  });

builder.Services.AddAuthorization();

var app = builder.Build();

// 启用认证和授权
app.UseAuthentication();
app.UseAuthorization();

// 保护API端点
app.MapGet("/api/protected-data", () => "仅登录用户可见的数据")
  .RequireAuthorization();

app.Run();

三、轻量替代方案:AWS SDK for JavaScript v3

如果不想引入 Amplify,可直接用 AWS SDK 调用 Cognito API,但需手动管理令牌刷新:

1. 安装依赖

npm install @aws-sdk/client-cognito-identity-provider

2. 登录获取令牌

import { CognitoIdentityProviderClient, InitiateAuthCommand } from "@aws-sdk/client-cognito-identity-provider";

const client = new CognitoIdentityProviderClient({ region: '你的区域' });

const login = async (username, password) => {
  const command = new InitiateAuthCommand({
    AuthFlow: "USER_PASSWORD_AUTH",
    ClientId: "你的用户池应用客户端ID",
    AuthParameters: { USERNAME: username, PASSWORD: password }
  });

  try {
    const res = await client.send(command);
    const { AccessToken, RefreshToken } = res.AuthenticationResult;
    localStorage.setItem('accessToken', AccessToken);
    localStorage.setItem('refreshToken', RefreshToken);
    return res;
  } catch (err) {
    console.error('登录失败:', err);
  }
};

令牌过期时,需调用 InitiateAuthCommand 并使用 REFRESH_TOKEN_AUTH 流程刷新令牌。

内容的提问来源于stack exchange,提问作者Sid Madani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.23 05:00:12