使用适用于 Azure 移动应用的 .NET 后端服务器 SDK

本主题说明如何在关键的 Azure 应用服务移动应用方案中使用 .NET 后端服务器 SDK。 借助 Azure 移动应用 SDK 可从 ASP.NET 应用程序使用移动客户端。

提示

适用于 Azure 移动应用的 .NET 服务器 SDK 是 GitHub 上的开放源代码。 该存储库包含所有源代码,包括整个服务器 SDK 单元测试套件以及一些示例项目。

参考文档

服务器 SDK 的参考文档位于此处:Azure Mobile Apps .NET Reference(Azure 移动应用 .NET 参考)。

如何创建 .NET 移动应用后端

如果要开始一个新项目,可以使用 Azure 门户或 Visual Studio 创建应用服务应用程序。 可以在本地运行应用服务应用程序,或将项目发布到基于云的应用服务移动应用。

如果将移动功能添加到现有项目,请参阅下载并初始化 SDK 部分。

使用 Azure 门户创建 .NET 后端

若要创建应用服务移动后端,请按照快速入门教程或以下步骤操作:

  1. 登录到 Azure 门户

  2. 单击“+新建”>“Web + 移动”>“移动应用”,并为移动应用后端提供一个名称。

  3. 在“资源组”下,选择一个现有资源组,或创建一个新资源组(使用与应用相同的名称)。

  4. 对于“应用服务计划”,请选择默认计划(在标准层中)。 还可以选择不同计划,或 创建一个新计划

    应用服务计划的设置将确定与应用关联的位置、功能、成本和计算资源。 有关应用服务计划以及如何在不同定价层和所需位置中创建新计划的详细信息,请参阅 Azure 应用服务计划深入概述

  5. 选择“创建”。 此步骤创建移动应用后端。

  6. 在新的移动应用后端的“设置”窗格中,依次选择“快速启动”、你的客户端应用平台、“连接数据库”。 >>

    用于连接数据库的选项选择

  7. 在“添加数据连接”窗格中,选择“SQL 数据库”>“创建新数据库”。 输入数据库名称,选择一个定价层,然后选择“服务器”。 可以重复使用此新数据库。 如果在同一位置已有数据库,则可选择“使用现有数据库”。 不建议使用位于不同位置的数据库,因为有带宽成本且延迟较高。

    选择数据库

  8. 在“新服务器”窗格中,在“服务器名称”框中输入唯一服务器名称,提供登录名和密码,选中“允许 Azure 服务访问服务器”,并选择“确定”。 此步骤创建新数据库。

  9. 回到“添加数据连接”窗格中,选择“连接字符串”,输入数据库的登录名和密码值,并选择“确定”。

    等待几分钟,等数据库署成功后再继续操作。

返回“开始使用”边栏选项卡,在“创建表 API”下面,选择“C#”作为“后端语言”。 单击“下载”,将压缩的项目文件解压缩到本地计算机,并在 Visual Studio 中打开解决方案。

使用 Visual Studio 2017 创建 .NET 后端

通过 Visual Studio 安装程序安装 Azure 工作负荷,以从 Visual Studio 发布到 Azure 移动应用项目。 安装 SDK 后,请使用以下步骤创建 ASP.NET 应用程序:

  1. 打开“新建项目”对话框(从“文件”>“新建”>“项目...”)。
  2. 展开“Visual C#”,然后选择“Web”
  3. 选择“ASP.NET Web 应用程序(.NET Framework)”
  4. 填写项目名称。 然后单击“确定”。
  5. 从模板列表中选择“Azure 移动应用”
  6. 单击“确定”创建解决方案
  7. 右键单击解决方案资源管理器中的项目,并选择“发布...”,然后选择“应用服务”作为发布目标
  8. 按照提示进行身份验证,然后选择新的或现有的 Azure 应用服务进行发布。

使用 Visual Studio 2015 创建 .NET 后端

安装用于 .NET 的 Azure SDK(2.9.0 版或更高版本),在 Visual Studio 中创建 Azure 移动应用项目。 安装 SDK 后,请使用以下步骤创建 ASP.NET 应用程序:

  1. 打开“新建项目”对话框(从“文件”>“新建”>“项目...”)。
  2. 展开“模板”>“Visual C#”,然后选择“Web”。
  3. 选择“ASP.NET Web 应用程序”。
  4. 填写项目名称。 然后单击“确定”。
  5. 在“ASP.NET 4.5.2 模板”下,选择“Azure 移动应用”。 选中“云中的主机”,在云中创建移动后端(可在其中发布此项目)。
  6. 单击“确定”。

如何下载并初始化 SDK

该 SDK 在 NuGet.org 上提供。此包包括开始使用该 SDK 所需的基本功能。 若要初始化该 SDK,需要对 HttpConfiguration 对象执行操作。

安装 SDK

要安装该 SDK,请在 Visual Studio 中右键单击服务器项目,选择“管理 NuGet 包”,搜索 Microsoft.Azure.Mobile.Server 包,并单击“安装”

初始化服务器项目

初始化 .NET 后端服务器项目的方式类似其他 ASP.NET 项目,可通过包含 OWIN 启动类来完成。 确保已引用 NuGet 包 Microsoft.Owin.Host.SystemWeb。 若要在 Visual Studio 中添加此类,请右键单击服务器项目,选择 “添加”>“新建项” ,然后选择 “Web”>“常规”>“OWIN 启动类” 。 将生成具有以下属性的类:

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

在 OWIN startup 类的 Configuration() 方法中,使用 HttpConfiguration 对象配置 Azure 移动应用环境。 以下示例初始化未添加任何功能的服务器项目:

// 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 门户中的服务器快速启动代码调用 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 移动应用主页。
  • MapApiControllers(),用于为使用 [MobileAppController] 属性修饰的 WebAPI 控制器提供自定义 API 功能。
  • AddTables(),用于提供到表控制器的 /tables 终结点映射。
  • AddTablesWithEntityFramework(),是使用基于实体框架的控制器映射 /tables 终结点的简单方法。
  • AddPushNotifications(),提供了一种向通知中心注册设备的简单方法。
  • MapLegacyCrossDomainController(),提供标准 CORS 标头进行本地开发。

SDK 扩展

以下基于 NuGet 的扩展包提供应用程序可以使用的多种移动功能。 可以使用 MobileAppConfiguration 对象在初始化期间启用扩展。

  • Microsoft.Azure.Mobile.Server.Quickstart 支持基本的移动应用设置。 在初始化期间,通过调用 UseDefaultConfiguration 扩展方法添加到配置。 此扩展包含以下扩展:通知、身份验证、实体、表、跨域和主目录包。 此包由 Azure 门户上可用的“移动应用快速入门”使用。
  • Microsoft.Azure.Mobile.Server.Home 为网站根目录实现默认的此移动应用已启动并正在运行页。 通过调用 AddMobileAppHomeController 扩展方法添加到配置。
  • Microsoft.Azure.Mobile.Server.Tables 包含用于处理数据和设置数据管道的类。 通过调用 AddTables 扩展方法添加到配置。
  • Microsoft.Azure.Mobile.Server.Entity 使实体框架能够访问 SQL 数据库中的数据。 通过调用 AddTablesWithEntityFramework 扩展方法添加到配置。
  • Microsoft.Azure.Mobile.Server.Authentication 启用身份验证,并设置用于验证令牌的 OWIN 中间件。 通过调用 AddAppServiceAuthentication 与 IAppBuilder.UseAppServiceAuthentication 扩展方法添加到配置
  • Microsoft.Azure.Mobile.Server.Notifications 启用推送通知并定义推送注册终结点。 通过调用 AddPushNotifications 扩展方法添加到配置。
  • Microsoft.Azure.Mobile.Server.CrossDomain 创建从移动应用向旧版 Web 浏览器提供数据的控制器。 通过调用 MapLegacyCrossDomainController 扩展方法添加到配置。
  • Microsoft.Azure.Mobile.Server.Login 通过 AppServiceLoginHandler.CreateToken() 方法,该方法为静态方法,在自定义身份验证方案下使用。

如何发布服务器项目

本部分说明如何从 Visual Studio 发布 .NET 后端项目。 还可以使用 Git 或该处可用的任何其他方法部署后端项目。

  1. 在 Visual Studio 中,重新生成项目以还原 NuGet 包。

  2. 在“解决方案资源管理器”中,右键单击该项目并单击“发布”。 首次发布时,需要定义发布配置文件。 如果已定义配置文件,可以直接选择该配置文件,并单击“发布”

  3. 如果系统要求选择发布目标,请单击“Microsoft Azure App Service”>“下一步”,然后使用 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 数据库中的表。 要创建数据库条目,请将 DbSet<> 属性添加到正在使用的 DbContext 中。 在 Azure 移动应用的默认项目模板中,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. 右键单击“控制器”文件夹,然后选择“添加”>“控制器...”。
  2. 选择“Azure 移动应用表控制器”选项,并单击“添加”
  3. 在“添加控制器”对话框中:
    • 在“模型类”下拉框中,选择新的 DTO。
    • 在“DbContext”下拉框中,选择 Mobile Service DbContext 类。
    • 将创建控制器名称。
  4. 单击“添加”。

快速启动服务器项目包含一个简单的 TodoItemController 示例。

如何调整表分页大小

默认情况下,Azure 移动应用为每个请求返回 50 条记录。 分页可以确保客户端不会长时间占用其 UI 线程或服务器,从而提供良好的用户体验。 若要更改表分页大小,可增大服务器端“允许的查询大小”和客户端页面大小。服务器端“允许的查询大小”可使用 EnableQuery 属性进行调整:

[EnableQuery(PageSize = 500)]

确保 PageSize 等于或大于客户端请求的大小。 有关更改客户端页面大小的详细信息,请参阅具体的客户端操作指南文档。

如何定义自定义 API 控制器

自定义 API 控制器通过公开终结点,向移动应用后端提供最基本的功能。 可以使用 [MobileAppController] 属性注册移动设备特定的 API 控制器。 MobileAppController 属性将注册路由、设置移动应用 JSON 序列化程序,并打开客户端版本检查

  1. 在 Visual Studio 中,右键单击“控制器”文件夹,单击“添加”>“控制器”,选择“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 移动应用使用应用服务身份验证/授权保护移动后端。 本部分说明如何在 .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 中间件组件验证由关联的应用服务网关颁发的令牌。

  3. [Authorize] 属性添加到任何要求身份验证的控制器或方法。

若要了解如何在移动应用后端对客户端进行身份验证,请参阅向应用添加身份验证

如何对应用程序使用自定义身份验证

重要

若要启用自定义身份验证,必须先启用应用服务身份验证,而不必在 Azure 门户中为应用服务选择提供程序。 托管时这将启用 WEBSITE_AUTH_SIGNING_KEY 环境变量。

如果不想使用某个应用服务身份验证/授权提供程序,可以实现自己的登录系统。 安装 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() 方法包含 audienceissuer 参数。 这两个参数使用 HTTPS 方案设置为应用程序根目录的 URL。 同样,应将 secretKey 设置为应用程序的签名密钥值。 请勿分发客户端中的签名密钥,因为该密钥可用于伪造密钥和模拟用户。 你可以通过引用 WEBSITE_AUTH_SIGNING_KEY 环境变量来获取托管在应用服务中的签名密钥。 如果在本地调试上下文中有需要,可根据使用身份验证进行本地调试部分中的说明检索密钥,并将它存储为应用程序设置。

颁发的令牌还可以包括其他声明和到期日期。 颁发的令牌至少应包含一个使用者 (sub) 声明。

可以通过重载身份验证路由支持标准客户端 loginAsync() 方法。 如果客户端通过调用 client.loginAsync('custom'); 进行登录,则路由必须是 /.auth/login/custom。 可以使用 MapHttpRoute() 设置自定义身份验证控制器的路由:

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

提示

使用 loginAsync() 方法可确保将身份验证令牌附加到后续对服务的所有调用。

如何检索经过身份验证的用户信息

当应用服务对用户进行身份验证时,可以访问分配的用户 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 即表示无效的身份验证令牌。

应用服务还允许向登录提供程序请求特定声明。 每个标识提供者都可以使用标识提供者 SDK 提供更多信息。 例如,可以使用 Facebook Graph API 提供好友信息。 可以在 Azure 门户上的提供程序边栏选项卡中指定请求的声明。 某些声明需要标识提供者的额外配置。

可以使用以下代码调用 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() 方法返回的 IQueryable 可通过 LINQ 操作来处理筛选。

如何将推送通知添加到服务器项目

通过扩展 MobileAppConfiguration 对象并创建通知中心客户端,将推送通知添加到服务器项目。

  1. 在 Visual Studio 中,右键单击服务器项目并单击“管理 NuGet 包”,搜索 Microsoft.Azure.Mobile.Server.Notifications,并单击“安装”

  2. 重复此步骤安装 Microsoft.Azure.NotificationHubs 包,其中包含通知中心客户端库。

  3. 在 App_Start/Startup.MobileApp.cs 中,于初始化期间添加对 AddPushNotifications 扩展方法的调用:

     new MobileAppConfiguration()
         // other features...
         .AddPushNotifications()
         .ApplyTo(config);
    
  4. 添加以下代码用于创建通知中心客户端:

     // 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);
    

目前可以使用通知中心客户端将推送通知发送到已注册的设备。 有关详细信息,请参阅向应用添加推送通知。 若要了解通知中心的详细信息,请参阅通知中心概述

如何使用标记启用目标推送

通知中心允许使用标记将目标通知发送到特定的注册。 将自动创建多个标记:

  • 安装 ID 标识特定设备。
  • 基于经过身份验证的 SID 的用户 ID 可标识特定用户。

可以从 MobileServiceClient 上的 installationId 属性访问安装 ID。 以下示例演示如何在通知中心内使用安装 ID 将标记添加到特定的安装:

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

创建安装时,后端将忽略客户端在推送通知注册期间提供的任何标记。 要使客户端能够将标记添加到安装,必须创建一个自定义 API,此 API 可以使用上述模式添加标记。

有关示例,请参阅应用服务移动应用的完整快速入门示例中的客户端添加的推送通知标记

如何将推送通知发送到经过身份验证的用户

当经过身份验证的用户注册推送通知时,用户 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 后端的应用服务移动应用的完整快速入门示例中的推送到用户

如何对 .NET 服务器 SDK 进行调试和故障排除

Azure 应用服务提供多种适用于 ASP.NET 应用程序的调试和故障排除方法:

日志记录

可以使用标准的 ASP.NET 跟踪写入来写入应用服务诊断日志。 写入日志之前,必须在移动应用后端中启用诊断。

启用诊断并写入日志:

  1. 按照启用应用程序日志记录 (Windows) 中的步骤操作。

  2. 在代码文件中添加以下 using 语句:

     using System.Web.Http.Tracing;
    
  3. 创建跟踪写入器以便从 .NET 后端写入诊断日志,如下所示:

     ITraceWriter traceWriter = this.Configuration.Services.GetTraceWriter();
     traceWriter.Info("Hello, World");
    
  4. 重新发布服务器项目,并访问移动应用后端,结合日志记录执行代码路径。

  5. 下载并评估日志,如访问日志文件中所述。

使用身份验证进行本地调试

可以先在本地运行应用程序以测试更改,然后将更改发布到云中。 对于大多数 Azure 移动应用后端,请在 Visual Studio 中按 F5。 但是,使用身份验证时需要考虑其他一些事项。

必须有基于云的移动应用,已配置应用服务身份验证/授权,并且客户端必须有指定为备用登录主机的云终结点。 请参阅相关的客户端平台文档获取所需的具体步骤。

确保移动后端已安装 Microsoft.Azure.Mobile.Server.Authentication。 然后,在将 MobileAppConfiguration 应用到 HttpConfiguration 之后,在应用程序的 OWIN 启动类中添加以下代码:

    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 门户 中导航到应用
  2. 依次单击“工具”、“Kudu”、“转到”
  3. 在 Kudu 管理站点中,单击“环境”
  4. 查找 WEBSITE_AUTH_SIGNING_KEY 的值。

在本地应用程序配置中使用 authSigningKey 参数的签名密钥。移动后端现在可在本地运行时验证令牌,而客户端从基于云的终结点获取令牌。