다음을 통해 공유


Azure Mobile Apps용 .NET 백 엔드 서버 SDK 사용

이 항목에서는 주요 Azure App Service Mobile Apps 시나리오에서 .NET 백 엔드 서버 SDK를 사용하는 방법을 보여 줍니다. Azure Mobile Apps SDK를 사용하면 ASP.NET 애플리케이션의 모바일 클라이언트로 작업할 수 있습니다.

팁 (조언)

Azure Mobile Apps용 .NET 서버 SDK는 GitHub의 오픈 소스입니다. 리포지토리에는 전체 서버 SDK 단위 테스트 도구 모음 및 일부 샘플 프로젝트를 포함한 모든 소스 코드가 포함됩니다.

참조 설명서

서버 SDK에 대한 참조 설명서는 Azure Mobile Apps .NET 참조에 있습니다.

방법: .NET 모바일 앱 백 엔드 만들기

새 프로젝트를 시작하는 경우 Azure Portal 또는 Visual Studio를 사용하여 App Service 애플리케이션을 만들 수 있습니다. App Service 애플리케이션을 로컬로 실행하거나 클라우드 기반 App Service 모바일 앱에 프로젝트를 게시할 수 있습니다.

기존 프로젝트에 모바일 기능을 추가하는 경우 SDK 다운로드 및 초기화 섹션을 참조하세요.

Azure Portal을 사용하여 .NET 백 엔드 만들기

App Service 모바일 백 엔드를 만들려면 빠른 시작 자습서 를 따르거나 다음 단계를 수행합니다.

  1. Azure Portal에 로그인합니다.

  2. +NEW>Web + Mobile Mobile>App을 선택한 다음 Mobile Apps 백 엔드의 이름을 입력합니다.

  3. 리소스 그룹의 경우 기존 리소스 그룹을 선택하거나 앱과 동일한 이름을 사용하여 새 리소스 그룹을 만듭니다.

  4. App Service 계획의 경우 기본 계획(표준 계층)이 선택됩니다. 다른 계획을 선택하거나 새 계획을 만들 수도 있습니다.

    App Service 계획의 설정은 앱 과 연결된 위치, 기능, 비용 및 컴퓨팅 리소스를 결정합니다 . App Service 계획 및 다른 가격 책정 계층 및 원하는 위치에서 새 계획을 만드는 방법에 대한 자세한 내용은 Azure App Service 계획의 심층 개요를 참조하세요.

  5. 선택하고생성합니다. 이 단계에서는 Mobile Apps 백 엔드를 만듭니다.

  6. 새 Mobile Apps 백 엔드에 대한 설정 창에서 클라이언트 앱 플랫폼 >> 선택합니다.

    데이터베이스 연결 선택

  7. 데이터 연결 추가 창에서 SQL Database>새 데이터베이스 만들기를 선택합니다. 데이터베이스 이름을 입력하고 가격 책정 계층을 선택한 다음 서버를 선택합니다. 이 새 데이터베이스를 다시 사용할 수 있습니다. 동일한 위치에 데이터베이스가 이미 있는 경우 기존 데이터베이스 사용을 대신 선택할 수 있습니다. 대역폭 비용과 더 높은 대기 시간으로 인해 다른 위치에 데이터베이스를 사용하지 않는 것이 좋습니다.

    데이터베이스 선택

  8. 새 서버 창에서 서버 이름 상자에 고유한 서버 이름을 입력하고, 로그인 및 암호를 제공하고, Azure 서비스에서 서버에 액세스하도록 허용을 선택하고, 확인을 선택합니다. 이 단계에서는 새 데이터베이스를 만듭니다.

  9. 데이터 연결 추가 창으로 돌아가서 연결 문자열을 선택하고 데이터베이스에 대한 로그인 및 암호 값을 입력한 다음 확인을 선택합니다.

    계속하기 전에 데이터베이스가 성공적으로 배포될 때까지 몇 분 정도 기다립니다.

시작 블레이드의 테이블 만들기 API에서 백 엔드 언어C#을 선택합니다. 다운로드를 클릭하고 압축된 프로젝트 파일을 로컬 컴퓨터에 추출한 다음 Visual Studio에서 솔루션을 엽니다.

Visual Studio 2017을 사용하여 .NET 백 엔드 만들기

Visual Studio 설치 관리자를 통해 Azure 워크로드를 설치하여 Visual Studio에서 Azure Mobile Apps 프로젝트에 게시합니다. SDK를 설치한 후 다음 단계를 사용하여 ASP.NET 애플리케이션을 만듭니다.

  1. [새 프로젝트 대화 상자]를 열려면 [파일]>[새]>[프로젝트...] 메뉴를 사용하십시오.
  2. Visual C#을 확장하고 을 선택합니다.
  3. ASP.NET 웹 애플리케이션(.NET Framework)을 선택합니다.
  4. 프로젝트 이름을 입력합니다. 그런 후 OK를 클릭합니다.
  5. 템플릿 목록에서 Azure Mobile App 을 선택합니다.
  6. 확인을 클릭하여 솔루션을 만듭니다.
  7. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 선택한 다음 App Service를 게시 대상으로 선택합니다.
  8. 프롬프트에 따라 인증하고 게시할 새 Azure App Service 또는 기존 Azure App Service를 선택합니다.

Visual Studio 2015를 사용하여 .NET 백 엔드 만들기

.NET용 Azure SDK(버전 2.9.0 이상)를 설치하여 Visual Studio에서 Azure Mobile Apps 프로젝트를 만듭니다. SDK를 설치한 후 다음 단계를 사용하여 ASP.NET 애플리케이션을 만듭니다.

  1. [새 프로젝트파일>]에서 [>프로젝트] 대화 상자를 엽니다.
  2. 템플릿Visual C#> 확장하고 을 선택합니다.
  3. ASP.NET 웹 애플리케이션을 선택합니다.
  4. 프로젝트 이름을 입력합니다. 그런 후 OK를 클릭합니다.
  5. ASP.NET 4.5.2 템플릿에서 Azure 모바일 앱을 선택합니다. 클라우드의 호스트를 확인하여 이 프로젝트를 게시할 수 있는 클라우드에 모바일 백 엔드를 만듭니다.
  6. OK를 클릭합니다.

방법: SDK 다운로드 및 초기화

SDK는 NuGet.org 사용할 수 있습니다. 이 패키지에는 SDK 사용을 시작하는 데 필요한 기본 기능이 포함되어 있습니다. SDK를 초기화하려면 HttpConfiguration 개체에 대한 작업을 수행해야 합니다.

SDK 설치

SDK를 설치하려면 Visual Studio에서 서버 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지 관리를 선택하고 Microsoft.Azure.Mobile.Server 패키지를 검색한 다음 설치를 클릭합니다.

서버 프로젝트를 초기화하십시오.

.NET 백 엔드 서버 프로젝트는 OWIN 시작 클래스를 포함하여 다른 ASP.NET 프로젝트와 유사하게 초기화됩니다. NuGet 패키지 Microsoft.Owin.Host.SystemWeb를 참조했는지 확인하십시오. Visual Studio에서 이 클래스를 추가하려면 서버 프로젝트를 마우스 오른쪽 단추로 클릭하고새 항목>, Web>General>OWIN Startup 클래스를 차례로 선택합니다. 클래스는 다음 특성으로 생성됩니다.

[assembly: OwinStartup(typeof(YourServiceName.YourStartupClassName))]

Configuration() OWIN 시작 클래스의 메서드에서 HttpConfiguration 개체를 사용하여 Azure Mobile Apps 환경을 구성합니다. 다음 예제에서는 추가된 기능 없이 서버 프로젝트를 초기화합니다.

// in OWIN startup class
public void Configuration(IAppBuilder app)
{
    HttpConfiguration config = new HttpConfiguration();

    new MobileAppConfiguration()
        // no added features
        .ApplyTo(config);

    app.UseWebApi(config);
}

개별 기능을 사용하도록 설정하려면 ApplyTo를 호출하기 전에 MobileAppConfiguration 개체에서 확장 메서드를 호출해야 합니다. 예를 들어 다음 코드는 초기화 중에 특성 [MobileAppController] 이 있는 모든 API 컨트롤러에 기본 경로를 추가합니다.

new MobileAppConfiguration()
    .MapApiControllers()
    .ApplyTo(config);

Azure Portal의 서버 빠른 시작은 UseDefaultConfiguration()을 호출합니다. 이는 다음 설정과 동일합니다.

    new MobileAppConfiguration()
        .AddMobileAppHomeController()             // from the Home package
        .MapApiControllers()
        .AddTables(                               // from the Tables package
            new MobileAppTableConfiguration()
                .MapTableControllers()
                .AddEntityFramework()             // from the Entity package
            )
        .AddPushNotifications()                   // from the Notifications package
        .MapLegacyCrossDomainController()         // from the CrossDomain package
        .ApplyTo(config);

사용되는 확장 메서드는 다음과 같습니다.

  • AddMobileAppHomeController() 에서는 기본 Azure Mobile Apps 홈페이지를 제공합니다.
  • MapApiControllers()[MobileAppController] 특성이 적용된 WebAPI 컨트롤러에 대한 사용자 지정 API 기능을 제공합니다.
  • AddTables() 는 테이블 컨트롤러에 /tables 대한 엔드포인트 매핑을 제공합니다.
  • AddTablesWithEntityFramework() 는 Entity Framework 기반 컨트롤러를 사용하여 /tables 엔드포인트를 매핑하는 단축 표현입니다.
  • AddPushNotifications() 는 Notification Hubs에 대한 디바이스를 등록하는 간단한 방법을 제공합니다.
  • MapLegacyCrossDomainController() 는 로컬 개발을 위한 표준 CORS 헤더를 제공합니다.

SDK 확장

다음 NuGet 기반 확장 패키지는 애플리케이션에서 사용할 수 있는 다양한 모바일 기능을 제공합니다. MobileAppConfiguration 개체를 사용하여 초기화하는 동안 확장을 사용하도록 설정합니다.

  • Microsoft.Azure.Mobile.Server.빠른 시작 은 기본 Mobile Apps 설정을 지원합니다. 초기화 중에 UseDefaultConfiguration 확장 메서드를 호출하여 구성에 추가되었습니다. 이 확장에는 알림, 인증, 엔터티, 테이블, 도메인 간 및 홈 패키지 등의 확장이 포함됩니다. 이 패키지는 Azure Portal에서 사용할 수 있는 Mobile Apps 빠른 시작에서 사용됩니다.
  • Microsoft.Azure.Mobile.Server.Home은 웹 사이트 루트의 기본 "이 모바일 앱은 작동 중입니다" 페이지를 구현합니다. AddMobileAppHomeController 확장 메서드를 호출하여 구성에 추가합니다.
  • Microsoft.Azure.Mobile.Server.Tables 에는 데이터 작업 및 데이터 파이프라인 설정에 대한 클래스가 포함되어 있습니다. AddTables 확장 메서드를 호출하여 구성에 추가합니다.
  • Microsoft.Azure.Mobile.Server.Entity 를 사용하면 Entity Framework에서 SQL Database의 데이터에 액세스할 수 있습니다. AddTablesWithEntityFramework 확장 메서드를 호출하여 구성에 추가합니다.
  • Microsoft.Azure.Mobile.Server.Authentication 을 사용하면 토큰의 유효성을 검사하는 데 사용되는 OWIN 미들웨어를 인증하고 설정합니다. AddAppServiceAuthenticationIAppBuilder를 호출하여 구성에 추가합니다. UseAppServiceAuthentication 확장 메서드.
  • Microsoft.Azure.Mobile.Server.Notifications 푸시 알림을 사용하도록 설정하고 푸시 등록 엔드포인트를 정의합니다. AddPushNotifications 확장 메서드를 호출하여 구성에 추가합니다.
  • Microsoft.Azure.Mobile.Server.CrossDomain 은 모바일 앱에서 레거시 웹 브라우저에 데이터를 제공하는 컨트롤러를 만듭니다. MapLegacyCrossDomainController 확장 메서드를 호출하여 구성에 추가합니다.
  • Microsoft.Azure.Mobile.Server.Login 은 사용자 지정 인증 시나리오에서 사용되는 정적 메서드인 AppServiceLoginHandler.CreateToken() 메서드를 제공합니다.

방법: 서버 프로젝트 게시

이 섹션에서는 Visual Studio에서 .NET 백 엔드 프로젝트를 게시하는 방법을 보여 줍니다. Git 또는 사용할 수 있는 다른 메서드를 사용하여 백 엔드 프로젝트를 배포할 수도 있습니다.

  1. Visual Studio에서 프로젝트를 다시 빌드하여 NuGet 패키지를 복원합니다.

  2. 솔루션 탐색기에서 프로젝트를 마우스 오른쪽 단추로 클릭하고 게시를 클릭합니다. 처음 게시할 때 게시 프로필을 정의해야 합니다. 이미 정의된 프로필이 있는 경우 프로필을 선택하고 게시를 클릭할 수 있습니다.

  3. 게시 대상을 선택하라는 메시지가 표시되면 Microsoft Azure App Service>Next를 클릭한 다음(필요한 경우) Azure 자격 증명으로 로그인합니다. Visual Studio는 Azure에서 직접 게시 설정을 다운로드하고 안전하게 저장합니다.

  4. 구독을 선택하고 보기에서 리소스 종류를 선택하고 모바일 앱을 확장한 다음 모바일 앱 백 엔드를 클릭한 다음 확인을 클릭합니다.

  5. 게시 프로필 정보를 확인하고 게시를 클릭합니다.

    모바일 앱 백 엔드가 성공적으로 게시되면 성공을 나타내는 방문 페이지가 표시됩니다.

방법: 테이블 컨트롤러 정의

모바일 클라이언트에 SQL 테이블을 노출하는 테이블 컨트롤러를 정의합니다. 테이블 컨트롤러를 구성하려면 다음 세 단계가 필요합니다.

  1. DTO(데이터 전송 개체) 클래스를 만듭니다.
  2. Mobile DbContext 클래스에서 테이블 참조를 구성합니다.
  3. 테이블 컨트롤러를 만듭니다.

DTO(데이터 전송 개체)는 .에서 EntityData상속되는 일반 C# 개체입니다. 다음은 그 예입니다.

public class TodoItem : EntityData
{
    public string Text { get; set; }
    public bool Complete {get; set;}
}

DTO는 SQL 데이터베이스 내에서 테이블을 정의하는 데 사용됩니다. 데이터베이스 항목을 만들려면 사용 중인 DbContext에 속성을 추가 DbSet<> 합니다. Azure Mobile Apps의 기본 프로젝트 템플릿에서 DbContext를 다음과 같이 호출 Models\MobileServiceContext.cs합니다.

public class MobileServiceContext : DbContext
{
    private const string connectionStringName = "Name=MS_TableConnectionString";

    public MobileServiceContext() : base(connectionStringName)
    {

    }

    public DbSet<TodoItem> TodoItems { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Conventions.Add(
            new AttributeToColumnAnnotationConvention<TableColumnAttribute, string>(
                "ServiceColumnTable", (property, attributes) => attributes.Single().ColumnType.ToString()));
    }
}

Azure SDK가 설치된 경우 이제 다음과 같이 템플릿 테이블 컨트롤러를 만들 수 있습니다.

  1. Controllers 폴더를 마우스 오른쪽 단추로 클릭하고 컨트롤러 추가>...를 선택합니다.
  2. Azure Mobile Apps 테이블 컨트롤러 옵션을 선택한 다음 추가를 클릭합니다.
  3. 컨트롤러 추가 대화 상자에서 다음을 수행합니다.
    • Model 클래스 드롭다운에서 새 DTO를 선택합니다.
    • DbContext 드롭다운에서 Mobile Service DbContext 클래스를 선택합니다.
    • 컨트롤러 이름이 자동으로 생성됩니다.
  4. 추가를 클릭합니다.

빠른 시작 서버 프로젝트에는 간단한 TodoItemController에 대한 예제가 포함되어 있습니다.

방법: 테이블 페이징 크기 조정

기본적으로 Azure Mobile Apps는 요청당 50개의 레코드를 반환합니다. 페이징을 통해 클라이언트가 UI 스레드와 서버를 너무 오랫동안 연결하지 않으므로 사용자 환경이 양호합니다. 테이블 페이징 크기를 변경하려면 서버 쪽 "허용되는 쿼리 크기"를 늘리고 클라이언트 쪽 페이지 크기를 늘리려면 다음 특성을 사용하여 EnableQuery 서버 쪽 "허용된 쿼리 크기"를 조정합니다.

[EnableQuery(PageSize = 500)]

PageSize가 클라이언트에서 요청한 크기와 동일하거나 큰지 확인합니다. 클라이언트 페이지 크기 변경에 대한 자세한 내용은 특정 클라이언트 HOWTO 설명서를 참조하세요.

방법: 사용자 지정 API 컨트롤러 정의

사용자 지정 API 컨트롤러는 엔드포인트를 노출하여 모바일 앱 백 엔드에 가장 기본적인 기능을 제공합니다. [MobileAppController] 특성을 사용하여 모바일 특정 API 컨트롤러를 등록할 수 있습니다. 이 MobileAppController 특성은 경로를 등록하고, Mobile Apps의 JSON 직렬화 도구를 설정하며, 클라이언트 버전 확인을 활성화합니다.

  1. Visual Studio에서 Controllers 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 추가>를 클릭하고 컨트롤러를 클릭합니다. Web API 2 컨트롤러 - 빈을 선택하고 추가를 클릭합니다.

  2. 컨트롤러 이름(예: CustomController)을 제공하고 추가를 클릭합니다.

  3. 새 컨트롤러 클래스 파일에서 다음 using 문을 추가합니다.

     using Microsoft.Azure.Mobile.Server.Config;
    
  4. 다음 예제와 같이 [MobileAppController] 특성을 API 컨트롤러 클래스 정의에 적용합니다.

     [MobileAppController]
     public class CustomController : ApiController
     {
           //...
     }
    
  5. App_Start/Startup.MobileApp.cs 파일에서 다음 예제와 같이 MapApiControllers 확장 메서드에 대한 호출을 추가합니다.

     new MobileAppConfiguration()
         .MapApiControllers()
         .ApplyTo(config);
    

UseDefaultConfiguration() 확장 메서드를 MapApiControllers() 대신 사용할 수도 있습니다. MobileAppControllerAttribute가 적용되지 않은 컨트롤러는 클라이언트에서 계속 액세스할 수 있지만 모바일 앱 클라이언트 SDK를 사용하는 클라이언트에서 올바르게 사용되지 않을 수 있습니다.

방법: 인증 작업

Azure Mobile Apps는 App Service 인증/권한 부여를 사용하여 모바일 백 엔드를 보호합니다. 이 섹션에서는 .NET 백 엔드 서버 프로젝트에서 다음 인증 관련 작업을 수행하는 방법을 보여 줍니다.

방법: 서버 프로젝트에 인증 추가

MobileAppConfiguration 개체를 확장하고 OWIN 미들웨어를 구성하여 서버 프로젝트에 인증을 추가할 수 있습니다. Microsoft.Azure.Mobile.Server.Quickstart 패키지를 설치하고 UseDefaultConfiguration 확장 메서드를 호출하는 경우 3단계로 건너뛸 수 있습니다.

  1. Visual Studio에서 Microsoft.Azure.Mobile.Server.Authentication 패키지를 설치합니다.

  2. Startup.cs 프로젝트 파일에서 Configuration 메서드의 시작 부분에 다음 코드 줄을 추가합니다.

     app.UseAppServiceAuthentication(config);
    

    이 OWIN 미들웨어 구성 요소는 연결된 App Service 게이트웨이에서 발급한 토큰의 유효성을 검사합니다.

  3. 컨트롤러나 메서드가 인증을 요구하는 경우, [Authorize] 특성을 추가하십시오.

Mobile Apps 백 엔드에 클라이언트를 인증하는 방법에 대한 자세한 내용은 앱에 인증 추가를 참조하세요.

방법: 애플리케이션에 사용자 지정 인증 사용

중요합니다

사용자 지정 인증을 사용하도록 설정하려면 먼저 Azure Portal에서 App Service에 대한 공급자를 선택하지 않고 App Service 인증을 사용하도록 설정해야 합니다. 이렇게 하면 호스트될 때 WEBSITE_AUTH_SIGNING_KEY 환경 변수가 활성화됩니다.

App Service 인증/권한 부여 공급자 중 하나를 사용하지 않으려면 사용자 고유의 로그인 시스템을 구현할 수 있습니다. 인증 토큰 생성을 지원하기 위해 Microsoft.Azure.Mobile.Server.Login 패키지를 설치합니다. 사용자 자격 증명의 유효성을 검사하기 위한 고유한 코드를 제공합니다. 예를 들어, 데이터베이스에서 솔트된 비밀번호와 해시된 비밀번호를 대조할 수 있습니다. 아래 isValidAssertion() 예제에서는 메서드(다른 곳에서 정의됨)가 이러한 검사를 담당합니다.

사용자 지정 인증은 ApiController를 생성하고 registerlogin 작업을 노출하여 구현됩니다. 클라이언트는 사용자 지정 UI를 사용하여 사용자로부터 정보를 수집해야 합니다. 그런 다음, 표준 HTTP POST 호출을 사용하여 정보를 API에 제출합니다. 서버가 어설션의 유효성을 검사하면 메서드를 사용하여 토큰이 AppServiceLoginHandler.CreateToken() 발급됩니다. ApiController는 [MobileAppController] 특성을 사용해야 합니다.

예제 login 작업:

    public IHttpActionResult Post([FromBody] JObject assertion)
    {
        if (isValidAssertion(assertion)) // user-defined function, checks against a database
        {
            JwtSecurityToken token = AppServiceLoginHandler.CreateToken(new Claim[] { new Claim(JwtRegisteredClaimNames.Sub, assertion["username"]) },
                mySigningKey,
                myAppURL,
                myAppURL,
                TimeSpan.FromHours(24) );
            return Ok(new LoginResult()
            {
                AuthenticationToken = token.RawData,
                User = new LoginResultUser() { UserId = userName.ToString() }
            });
        }
        else // user assertion was not valid
        {
            return this.Request.CreateUnauthorizedResponse();
        }
    }

앞의 예제에서 LoginResult 및 LoginResultUser는 필수 속성을 노출하는 직렬화 가능한 개체입니다. 클라이언트는 로그인 응답이 양식의 JSON 개체로 반환될 것으로 예상합니다.

    {
        "authenticationToken": "<token>",
        "user": {
            "userId": "<userId>"
        }
    }

메서드에는 AppServiceLoginHandler.CreateToken()대상 그룹 및 발급자 매개 변수가 포함됩니다. 두 매개 변수는 모두 HTTPS 스키마를 사용하여 애플리케이션 루트의 URL로 설정됩니다. 마찬가지로 secretKey 를 애플리케이션의 서명 키 값으로 설정해야 합니다. 클라이언트에서 서명 키를 배포하지 마세요. 이 키를 사용하여 사용자를 가장할 수 있습니다. WEBSITE_AUTH_SIGNING_KEY 환경 변수를 참조하여 App Service에서 호스트되는 동안 서명 키를 가져올 수 있습니다. 로컬 디버깅 컨텍스트에서 필요한 경우 인증 섹션을 사용하여 로컬 디버깅 의 지침에 따라 키를 검색하고 애플리케이션 설정으로 저장합니다.

발급된 토큰에는 다른 클레임 및 만료 날짜도 포함될 수 있습니다. 최소한 발급된 토큰에는 주체(하위) 클레임이 포함되어야 합니다.

인증 경로를 오버로드하여 표준 클라이언트 loginAsync() 메서드를 지원할 수 있습니다. 클라이언트가 client.loginAsync('custom');를 호출하여 로그인하는 경우, 귀하의 경로는 /.auth/login/custom이어야 합니다. 다음을 사용하여 MapHttpRoute()사용자 지정 인증 컨트롤러에 대한 경로를 설정할 수 있습니다.

config.Routes.MapHttpRoute("custom", ".auth/login/custom", new { controller = "CustomAuth" });

팁 (조언)

loginAsync() 방법을 사용하면 인증 토큰이 서비스에 대한 모든 후속 호출에 연결됩니다.

방법: 인증된 사용자 정보 검색

App Service에서 사용자를 인증하면 할당된 사용자 ID 및 .NET 백 엔드 코드의 기타 정보에 액세스할 수 있습니다. 사용자 정보는 백 엔드에서 권한 부여 결정을 내리는 데 사용할 수 있습니다. 다음 코드는 요청과 연결된 사용자 ID를 가져옵니다.

// Get the SID of the current user.
var claimsPrincipal = this.User as ClaimsPrincipal;
string sid = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;

SID는 공급자별 사용자 ID에서 파생되며 지정된 사용자 및 로그인 공급자에 대해 정적입니다. 잘못된 인증 토큰의 경우 SID가 null입니다.

App Service를 사용하면 로그인 공급자로부터 특정 클레임을 요청할 수도 있습니다. 각 ID 공급자는 ID 공급자 SDK를 사용하여 자세한 정보를 제공할 수 있습니다. 예를 들어 친구 정보에 Facebook Graph API를 사용할 수 있습니다. Azure Portal의 공급자 블레이드에서 요청된 클레임을 지정할 수 있습니다. 일부 클레임에는 ID 공급자를 사용한 추가 구성이 필요합니다.

다음 코드는 GetAppServiceIdentityAsync 확장 메서드를 호출하여 Facebook Graph API에 대한 요청을 하는 데 필요한 액세스 토큰을 포함하는 로그인 자격 증명을 가져옵니다.

// Get the credentials for the logged-in user.
var credentials =
    await this.User
    .GetAppServiceIdentityAsync<FacebookCredentials>(this.Request);

if (credentials.Provider == "Facebook")
{
    // Create a query string with the Facebook access token.
    var fbRequestUrl = "https://graph.facebook.com/me/feed?access_token="
        + credentials.AccessToken;

    // Create an HttpClient request.
    var client = new System.Net.Http.HttpClient();

    // Request the current user info from Facebook.
    var resp = await client.GetAsync(fbRequestUrl);
    resp.EnsureSuccessStatusCode();

    // Do something here with the Facebook user information.
    var fbInfo = await resp.Content.ReadAsStringAsync();
}

System.Security.Principal에 대한 using 문을 추가하여 GetAppServiceIdentityAsync 확장 메서드를 제공합니다.

방법: 권한 있는 사용자에 대한 데이터 액세스 제한

이전 섹션에서는 인증된 사용자의 사용자 ID를 검색하는 방법을 보여 줬습니다. 이 값에 따라 데이터 및 기타 리소스에 대한 액세스를 제한할 수 있습니다. 예를 들어 테이블에 userId 열을 추가하고 사용자 ID로 쿼리 결과를 필터링하는 것은 반환된 데이터만 권한 있는 사용자로 제한하는 간단한 방법입니다. 다음 코드는 SID가 TodoItem 테이블의 UserId 열 값과 일치하는 경우에만 데이터 행을 반환합니다.

// Get the SID of the current user.
var claimsPrincipal = this.User as ClaimsPrincipal;
string sid = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;

// Only return data rows that belong to the current user.
return Query().Where(t => t.UserId == sid);

Query() 메서드는 LINQ로 조작하여 필터링을 처리할 수 있는 IQueryable를 반환합니다.

방법: 서버 프로젝트에 푸시 알림 추가

MobileAppConfiguration 개체를 확장하고 Notification Hubs 클라이언트를 만들어 서버 프로젝트에 푸시 알림을 추가합니다.

  1. Visual Studio에서 서버 프로젝트를 마우스 오른쪽 단추로 클릭하고 NuGet 패키지관리를 클릭하고 Microsoft.Azure.Mobile.Server.Notifications검색한 다음 설치클릭합니다.

  2. 이 단계를 반복하여 Notification Hubs 클라이언트 라이브러리를 포함하는 패키지를 설치 Microsoft.Azure.NotificationHubs 합니다.

  3. App_Start/Startup.MobileApp.cs 초기화 중에 AddPushNotifications() 확장 메서드에 대한 호출을 추가합니다.

     new MobileAppConfiguration()
         // other features...
         .AddPushNotifications()
         .ApplyTo(config);
    
  4. Notification Hubs 클라이언트를 만드는 다음 코드를 추가합니다.

     // Get the settings for the server project.
     HttpConfiguration config = this.Configuration;
     MobileAppSettingsDictionary settings =
         config.GetMobileAppSettingsProvider().GetMobileAppSettings();
    
     // Get the Notification Hubs credentials for the Mobile App.
     string notificationHubName = settings.NotificationHubName;
     string notificationHubConnection = settings
         .Connections[MobileAppSettingsKeys.NotificationHubConnectionString].ConnectionString;
    
     // Create a new Notification Hub client.
     NotificationHubClient hub = NotificationHubClient
         .CreateClientFromConnectionString(notificationHubConnection, notificationHubName);
    

이제 Notification Hubs 클라이언트를 사용하여 등록된 디바이스에 푸시 알림을 보낼 수 있습니다. 자세한 내용은 앱에 푸시 알림 추가를 참조하세요. Notification Hubs에 대한 자세한 내용은 Notification Hubs 개요를 참조하세요.

방법: 태그를 사용하여 대상 푸시 사용

Notification Hubs를 사용하면 태그를 사용하여 특정 등록에 대상 알림을 보낼 수 있습니다. 여러 태그가 자동으로 생성됩니다.

  • 설치 ID는 특정 디바이스를 식별합니다.
  • 인증된 SID를 기반으로 하는 사용자 ID는 특정 사용자를 식별합니다.

MobileServiceClientinstallationId 속성에서 설치 ID에 액세스할 수 있습니다. 다음 예제에서는 설치 ID를 사용하여 Notification Hubs의 특정 설치에 태그를 추가하는 방법을 보여 줍니다.

hub.PatchInstallation("my-installation-id", new[]
{
    new PartialUpdateOperation
    {
        Operation = UpdateOperationType.Add,
        Path = "/tags",
        Value = "{my-tag}"
    }
});

푸시 알림 등록 중에 클라이언트에서 제공하는 태그는 설치를 만들 때 백 엔드에서 무시됩니다. 클라이언트가 설치에 태그를 추가할 수 있도록 하려면 이전 패턴을 사용하여 태그를 추가하는 사용자 지정 API를 만들어야 합니다.

예제는 App Service Mobile Apps 완료 빠른 시작 샘플에서 클라이언트가 추가한 푸시 알림 태그 를 참조하세요.

방법: 인증된 사용자에게 푸시 알림 보내기

인증된 사용자가 푸시 알림을 등록하면 사용자 ID 태그가 등록에 자동으로 추가됩니다. 이 태그를 사용하여 해당 사용자가 등록한 모든 디바이스에 푸시 알림을 보낼 수 있습니다. 다음 코드는 요청을 만드는 사용자의 SID를 가져오고 해당 사용자의 모든 디바이스 등록에 템플릿 푸시 알림을 보냅니다.

// Get the current user SID and create a tag for the current user.
var claimsPrincipal = this.User as ClaimsPrincipal;
string sid = claimsPrincipal.FindFirst(ClaimTypes.NameIdentifier).Value;
string userTag = "_UserId:" + sid;

// Build a dictionary for the template with the item message text.
var notification = new Dictionary<string, string> { { "message", item.Text } };

// Send a template notification to the user ID.
await hub.SendTemplateNotificationAsync(notification, userTag);

인증된 클라이언트에서 푸시 알림을 등록할 때 등록을 시도하기 전에 인증이 완료되었는지 확인합니다. 자세한 내용은 .NET 백 엔드에 대한 App Service Mobile Apps 완료 빠른 시작 샘플에서 사용자에게 푸시 를 참조하세요.

방법: .NET Server SDK 디버그 및 문제 해결

Azure App Service는 ASP.NET 애플리케이션에 대한 몇 가지 디버깅 및 문제 해결 기술을 제공합니다.

로깅 (로그 기록)

표준 ASP.NET 추적 쓰기를 사용하여 App Service 진단 로그에 쓸 수 있습니다. 로그에 쓰기 전에 모바일 앱 백 엔드에서 진단을 사용하도록 설정해야 합니다.

진단을 사용하도록 설정하고 로그에 쓰려면 다음을 수행합니다.

  1. 애플리케이션 로깅 사용(Windows)의 단계를 따릅니다.

  2. 코드 파일에 다음 using 문을 추가합니다.

     using System.Web.Http.Tracing;
    
  3. 다음과 같이 .NET 백 엔드에서 진단 로그로 쓸 추적 기록기를 만듭니다.

     ITraceWriter traceWriter = this.Configuration.Services.GetTraceWriter();
     traceWriter.Info("Hello, World");
    
  4. 서버 프로젝트를 다시 게시하고 Mobile App 백 엔드에 액세스하여 로깅을 사용하여 코드 경로를 실행합니다.

  5. Access 로그 파일에 설명된 대로 로그를 다운로드하고 평가합니다.

인증을 사용한 로컬 디버깅

클라우드에 게시하기 전에 애플리케이션을 로컬로 실행하여 변경 내용을 테스트할 수 있습니다. 대부분의 Azure Mobile Apps 백 엔드의 경우 Visual Studio에서 F5 키를 누릅니다. 그러나 인증을 사용할 때는 몇 가지 추가 고려 사항이 있습니다.

App Service 인증/권한 부여가 구성된 클라우드 기반 모바일 앱이 있어야 하며 클라이언트에 대체 로그인 호스트로 지정된 클라우드 엔드포인트가 있어야 합니다. 필요한 특정 단계는 클라이언트 플랫폼에 대한 설명서를 참조하세요.

모바일 백 엔드에 Microsoft.Azure.Mobile.Server.Authentication 이 설치되어 있는지 확인합니다. 그런 다음, 애플리케이션의 OWIN 시작 클래스에서 MobileAppConfigurationHttpConfiguration이 적용된 후 다음을 추가합니다.

    app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions()
    {
        SigningKey = ConfigurationManager.AppSettings["authSigningKey"],
        ValidAudiences = new[] { ConfigurationManager.AppSettings["authAudience"] },
        ValidIssuers = new[] { ConfigurationManager.AppSettings["authIssuer"] },
        TokenHandler = config.GetAppServiceTokenHandler()
    });

앞의 예제에서는 HTTPS 체계를 사용하여 Web.config 파일 내에서 authAudienceauthIssuer 애플리케이션 설정을 각각 애플리케이션 루트의 URL로 구성해야 합니다. 마찬가지로 authSigningKey 를 애플리케이션의 서명 키 값으로 설정해야 합니다. 서명 키를 가져오려면 다음을 수행합니다.

  1. Azure Portal 내에서 앱으로 이동
  2. 도구, Kudu, Go를 클릭합니다.
  3. Kudu 관리 사이트에서 환경을 클릭합니다.
  4. WEBSITE_AUTH_SIGNING_KEY 값을 찾습니다.

로컬 애플리케이션 구성에서 authSigningKey 매개 변수에 서명 키를 사용합니다. 이제 모바일 백 엔드는 로컬로 실행할 때 토큰의 유효성을 검사할 수 있도록 준비되었으며, 클라이언트는 클라우드 기반 엔드포인트에서 토큰을 가져옵니다.