다음을 통해 공유


Microsoft Entra를 사용하여 테넌트 간 권한 부여 구성

보안상의 이유로 서버는 Azure SignalR Service 리소스와 독립적인 테넌트에 호스트될 수 있습니다. 관리 ID는 테넌트 간에 사용할 수 없으므로 테넌트 A에 애플리케이션을 등록한 다음 테넌트 B에서 엔터프라이즈 애플리케이션으로 프로비전해야 합니다. 이 문서는 테넌트 A에서 애플리케이션을 만들고 이를 사용하여 테넌트 B의 Azure SignalR Service 리소스에 연결하는 데 도움이 됩니다.

테넌트 A에 다중 테넌트 애플리케이션 등록

첫 번째 단계는 다중 테넌트 애플리케이션을 만드는 것입니다. 자세한 내용은 빠른 시작: Microsoft Entra ID에 애플리케이션 등록을 참조하세요.

이미 단일 테넌트 애플리케이션이 있는 경우 Microsoft Entra ID에서 단일 테넌트 앱을 다중 테넌트로 변환의 지침을 따릅니다.

다음과 같은 네 가지 계정 유형이 있습니다.

  • 이 조직 디렉터리의 계정
  • 모든 조직 디렉터리의 계정
  • 모든 조직 디렉터리의 계정 및 개인 Microsoft 계정
  • 개인 Microsoft 계정

애플리케이션을 만들 때 두 번째 형식 또는 세 번째 형식을 선택해야 합니다.

등록된 애플리케이션에 대한 정보의 개요를 보여 주는 스크린샷.

다음 단계에서 사용할 애플리케이션(클라이언트) ID 및 디렉터리(테넌트) ID를 기록해 둡니다.

테넌트 B에 애플리케이션을 설정합니다.

다른 테넌트에 등록된 애플리케이션에는 역할을 할당할 수 없습니다. 테넌트 B에서 외부 엔터프라이즈 애플리케이션으로 프로비전해야 합니다. 자세한 정보가 필요한 경우 앱 등록과 엔터프라이즈 애플리케이션 간의 차이점에 대해 알아볼 수 있습니다.

간단히 말해서 엔터프라이즈 애플리케이션은 서비스 주체이며 앱 등록은 그렇지 않습니다. 엔터프라이즈 애플리케이션은 애플리케이션(클라이언트) ID와 같은 애플리케이션 개체에서 특정 속성을 상속합니다.

앱이 등록된 테넌트에 기본 서비스 주체가 만들어집니다. 다른 테넌트의 경우 엔터프라이즈 애플리케이션 서비스 주체를 가져오려면 앱을 프로비전해야 합니다. 자세한 내용은 Microsoft Entra ID 다중 테넌트 애플리케이션에서 엔터프라이즈 애플리케이션 만들기를 참조하세요.

서로 다른 테넌트에 있는 엔터프라이즈 애플리케이션에는 서로 다른 디렉터리(테넌트) ID가 있지만 동일한 애플리케이션(클라이언트) ID를 공유합니다.

엔터프라이즈 애플리케이션에 역할 할당

테넌트 B에서 엔터프라이즈 애플리케이션을 프로비전한 후 역할을 할당할 수 있습니다.

다음 단계에서는 Azure SignalR Service 리소스에 대한 서비스 주체 또는 관리 ID에 SignalR App Server 역할을 할당하는 방법을 설명합니다. 자세한 단계는 Azure Portal을 사용하여 Azure 역할 할당을 참조하세요.

비고

관리 그룹, 구독, 리소스 그룹 또는 단일 리소스를 비롯한 모든 범위에 역할을 할당할 수 있습니다. 범위에 대한 자세한 내용은 Azure RBAC의 범위 이해를 참조하세요.

  1. Azure Portal에서 Azure SignalR Service 리소스로 이동합니다.

  2. 왼쪽 창에서 액세스 제어(IAM)를 선택합니다.

  3. 추가>역할 할당 추가를 선택합니다.

    역할 할당을 추가하기 위한 선택 영역 및 액세스 제어 페이지를 보여 주는 스크린샷.

  4. 역할 탭에서 SignalR 앱 서버를 선택합니다. 다른 Azure SignalR Service 기본 제공 역할은 시나리오에 따라 달라집니다.

    역할 설명 사용 사례
    SignalR 앱 서버 서버 연결을 만들고 키를 생성하는 API에 액세스합니다. Azure SignalR 리소스가 기본 모드로 실행되는 앱 서버에 가장 일반적으로 사용됩니다.
    SignalR Service 소유자 REST API, 서버 연결을 만드는 API 및 키/토큰을 생성하는 API를 비롯한 모든 데이터 평면 API에 대한 모든 액세스 권한 서버리스 모드에서 실행되는 Azure SignalR Service 리소스가 있는 협상 서버에 사용됩니다. REST API 권한과 인증 API 권한이 모두 필요합니다.
    SignalR REST API 소유자 데이터 평면 REST API에 대한 모든 액세스 권한. Azure SignalR Management SDK에서 연결 및 그룹을 관리하는 데 사용되지만 서버 연결을 만들거나 협상 요청을 처리하지는 않습니다.
    SignalR REST API 읽기 권한자 데이터 평면 REST API에 대한 읽기 전용 액세스. 읽기 전용 REST API를 호출하는 모니터링 도구를 작성할 때 사용됩니다.
  5. 다음을 선택합니다.

  6. Microsoft Entra 애플리케이션의 경우:

    1. 행에 대한 액세스 할당 에서 사용자, 그룹 또는 서비스 주체를 선택합니다.
    2. 멤버 행에서 멤버를 선택한 다음 팝업 창에서 ID를 선택합니다.
  7. Azure 리소스에 대한 관리 ID의 경우:

    1. 행에 액세스를 할당할 대상에서 관리된 ID를 선택합니다.
    2. 멤버 행에서 멤버를 선택한 다음 팝업 창에서 애플리케이션을 선택합니다.
  8. 다음을 선택합니다.

  9. 과제를 검토한 다음 검토 + 할당 을 선택하여 역할 할당을 확인합니다.

중요합니다

새로 추가된 역할 할당이 전파되는 데 최대 30분이 걸릴 수 있습니다.

Azure 역할을 할당하고 관리하는 방법에 대한 자세한 내용은 다음을 참조하세요.

엔터프라이즈 애플리케이션을 사용하도록 Azure SignalR Service SDK 구성

애플리케이션은 세 가지 유형의 자격 증명을 사용하여 자신을 인증합니다.

  • 인증서
  • 클라이언트 암호
  • 연합 아이덴티티

인증서 또는 클라이언트 비밀을 사용하여 테넌트 간 요청을 수행하는 것이 좋습니다.

인증서 또는 클라이언트 비밀 사용

  • tenantId 매개 변수는 테넌트 B의 ID입니다.
  • clientId 두 테넌트 모두의 매개 변수가 동일합니다.
  • clientCert 매개 변수는 clientSecret 테넌트 A에서 구성됩니다. 자세한 내용은 자격 증명 추가를 참조하세요.

테넌트 ID를 잘 모르는 경우 Microsoft Entra 테넌트 찾기를 참조하세요.

services.AddSignalR().AddAzureSignalR(option =>
{
    var credential1 = new ClientSecretCredential("tenantId", "clientId", "clientSecret");
    var credential2 = new ClientCertificateCredential("tenantId", "clientId", "path-to-cert");

    option.Endpoints = new ServiceEndpoint[]
    {
        new ServiceEndpoint(new Uri("https://<resource1>.service.signalr.net"), credential1),
        new ServiceEndpoint(new Uri("https://<resource2>.service.signalr.net"), credential2),
    };
});

페더레이션 ID 사용

보안상의 이유로 구독에서 인증서 및 클라이언트 비밀을 사용하지 않도록 설정할 수 있습니다. 이 경우 외부 ID 공급자를 사용하거나 관리 ID에 대한 미리 보기 지원을 시도해야 합니다. 자세한 내용은 다음을 참조하세요.

자세한 정보 및 비디오 안내는 Microsoft Entra 교차 임대 애플리케이션 페더레이션 ID 자격 증명(FIC)을 참조하세요.

ID 공급자로 관리 ID를 사용하는 경우 코드는 다음 예제와 같습니다.

  • tenantId 매개 변수는 테넌트 B의 ID입니다.
  • clientId 두 테넌트 모두의 매개 변수가 동일합니다.
services.AddSignalR().AddAzureSignalR(option =>
{
    var msiCredential = new ManagedIdentityCredential("msiClientId");

    var credential = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
    {
        // Entra ID US Government: api://AzureADTokenExchangeUSGov
        // Entra ID China operated by 21Vianet: api://AzureADTokenExchangeChina
        var request = new TokenRequestContext([$"api://AzureADTokenExchange/.default"]);
        var response = await msiCredential.GetTokenAsync(request, ctoken).ConfigureAwait(false);
        return response.Token;
    });

    option.Endpoints = [
        new ServiceEndpoint(new Uri(), "https://<resource>.service.signalr.net"), credential);
    ];
});

외부 ID 공급자를 사용하는 경우 코드는 다음 예제와 같습니다.

services.AddSignalR().AddAzureSignalR(option =>
{
    var credential = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
    {
        // Find your own way to get a token from the external identity provider.
        // The audience of the token should be "api://AzureADTokenExchange" because it is the recommended value.
        return "TheTokenYouGetFromYourExternalIdentityProvider";
    });

    option.Endpoints = [
        new ServiceEndpoint(new Uri(), "https://<resource>.service.signalr.net"), credential);
    ];
});

Azure SignalR Service SDK를 사용하여 토큰 획득을 디버깅하는 것은 토큰 결과에 따라 달라지기 때문에 어려운 일입니다. Azure SignalR Service SDK와 통합하기 전에 토큰 획득 프로세스를 로컬로 테스트하는 것이 좋습니다.

var assertion = new ClientAssertionCredential("tenantId", "appClientId", async (ctoken) =>
{
    // Find your own way to get a token from the external identity provider.
    // The audience of the token should be "api://AzureADTokenExchange" because it is the recommended value.
    return TheTokenYouGetFromYourExternalIdentityProvider;
});

var request = new TokenRequestContext(["https://signalr.azure.com/.default");
var token = await assertion.GetTokenAsync(assertion);
Console.log(token.Token);

핵심은 내부 자격 증명을 사용하여 clientAssertion 매개 변수를 api://AzureADTokenExchange 또는 다른 신뢰할 수 있는 ID 플랫폼에서 가져오는 것입니다. 그런 다음 이를 사용하여 https://signalr.azure.com/.default 대상 그룹과 토큰을 교환하여 리소스에 액세스합니다.

목표는 다음 클레임이 있는 토큰을 가져오는 것입니다. jwt.io 사용하여 토큰을 디코딩할 수 있습니다.

  • oid: 값은 엔터프라이즈 애플리케이션 개체 ID와 같아야 합니다. 어디서 가져와야 할지 모르는 경우 엔터프라이즈 개체 ID 검색을 참조하세요.
  • tid: 값은 테넌트 B의 디렉터리 ID와 같아야 합니다. 테넌트 ID를 잘 모르는 경우 Microsoft Entra 테넌트 찾기를 참조하세요.
  • 대상 그룹: Azure SignalR Service 리소스에 액세스하려면 대상 그룹이 https://signalr.azure.com/.default여야 합니다.