gpt4 book ai didi

Azure 移动应用服务 - 自定义身份验证 - 有效受众

转载 作者:行者123 更新时间:2023-12-02 07:12:01 25 4
gpt4 key购买 nike

我已经设置了 Azure 移动应用服务后端,并且有一个 Xamarin 应用使用其服务。它使用 Azure 移动应用服务中的自定义身份验证来注册和验证应用程序的用户。

对于本地开发/调试应用程序的 OWIN 启动类包含一些用于设置应用程序服务的身份验证选项的代码,如 https://azure.microsoft.com/nl-nl/documentation/articles/app-service-mobile-dotnet-backend-how-to-use-server-sdk/#local-debug 中所述。 .

在 Azure 中,启用移动应用服务的身份验证(身份验证/授权),将“请求未经身份验证时采取的操作”选项设置为“允许请求(无操作)”,以便应用程序处理请求验证。

这一切都按预期工作。

现在,我们希望在我们的移动应用服务上支持自定义域,并支持当前的 ourmobileappservice.azurewebsites.net 域。我们已经配置了自定义域,配置了它的 SSL 证书,一切运行良好。新 token 是通过自定义域作为受众/发行者发行的,并且也在该庄园中进行了验证。

但是,当以 ourmobileappservice.azurewebsites.net 作为受众/颁发者颁发 token 时, token 验证期间会被拒绝。似乎只有我们的自定义域被允许作为有效受众。

对于本地开发,我们指定 app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions { ... }),同时设置 ValidAudiences 属性。因此,我也想在 Azure 环境中使用此设置,以便我们可以为 token 验证指定多个有效受众。 注意:当然,AppServiceAuthenticationOptions 与本地开发不同,例如SigningKey 来自 Azure 的环境变量)。

不幸的是 Azure 似乎根本不使用这个。它仍然以完全相同的方式不断失败。正如您所看到的,只有自定义域被指定为有效受众:

Warning JWT validation failed: IDX10214: Audience validation failed. Audiences: 'https://ourmobileappservice.azurewebsites.net/'. Did not match: validationParameters.ValidAudience: 'https://ourcustom.domain.com/' or validationParameters.ValidAudiences: 'null'.

如何使用自定义身份验证设置配置 Azure 移动应用服务,以便其有效受众同时支持自定义域和之前的 ourmobileappservice.azurewebsites.net?

编辑

为 Azure 指定的有效受众如下:

public static void ConfigureMobileApp(IAppBuilder app)
{
...

app.UseAppServiceAuthentication(new AppServiceAuthenticationOptions
{
SigningKey = Environment.GetEnvironmentVariable("WEBSITE_AUTH_SIGNING_KEY"),
ValidAudiences = new[] { "https://ourcustom.domain.com/", "https://ourmobileappservice.azurewebsites.net/" },
ValidIssuers = new[] { "https://ourcustom.domain.com/", "https://ourmobileappservice.azurewebsites.net/" },
TokenHandler = config.GetAppServiceTokenHandler()
});

...
}

最佳答案

您可以使用自定义身份验证提供程序中您喜欢的任何 URL 对 token 进行签名。您在 AppServiceLoginHandler.CreateToken() 方法中指定的任何内容都将进入 JWT。

在验证 token 时,如果您在本地调试,中间件中指定的 URL 列表将用于验证受众和发行者。在生产环境中,Azure 将神奇地使用您的默认 Azure 域和自定义域。

我的方法是创建一个新的 web.config AppSetting,其中包含所有环境的有效签名 URL。

 <add key="ValidUrls" value="https://api.myproductiondomain.com/, https://myproductionapp.azurewebsites.net/, http://localhost:59475/" />

在 Startup.MobilApp.cs 中,我从此列表中填充有效受众和发行者。

MobileAppSettingsDictionary settings = config.GetMobileAppSettingsProvider().GetMobileAppSettings();

if (string.IsNullOrEmpty(settings.HostName))
{
// This middleware is intended to be used locally for debugging. By default, HostName will
// only have a value when running in an App Service application.

var validUrls = ConfigurationManager.AppSettings["ValidUrls"].Split(',').Select(u => u.Trim()).ToList();

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

现在,在生成 token 之前,在我的登录方法中,我检查当前请求的主机名是否位于同一 AppSetting 白名单中。如果有效,请使用当前主机名作为我的 token 的受众和发行者。

类似这样的东西;

    // Get current URL
var signingUrl = $"{this.Request.RequestUri.Scheme}://{this.Request.RequestUri.Authority}/";

// Get list from AppSetting
var validUrls = ConfigurationManager.AppSettings["ValidUrls"].Split(',').Select(u => u.Trim()).ToList();

// Ensure current url is in whitelist
if (!validUrls.Contains(signingUrl))
{
return this.Request.CreateUnauthorizedResponse();
}


var claims = new Claim[]
{
new Claim(JwtRegisteredClaimNames.Sub, user.Id),
};

var signingKey = this.GetSigningKey();

// Sign token with this
var audience = signingUrl;
var issuer = signingUrl;


// Set expirey
var expiry = TimeSpan.FromHours(72);

// Generate token
JwtSecurityToken token = AppServiceLoginHandler.CreateToken(
claims,
signingKey,
audience,
issuer,
expiry
);

关于Azure 移动应用服务 - 自定义身份验证 - 有效受众,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39853261/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com