【发布时间】:2018-11-13 04:56:03
【问题描述】:
需要任何人的帮助。
我有一个与 WebApi (.Net 4.52) 对话的 SPA 客户端应用程序。两者都是我公司开发的。它与 WebAPI 自己生成的令牌一起工作得很好(基于来自 bitoftech 的优秀文章)
我们现在希望允许使用 Azure 进行身份验证 - 更具体地说,是我客户自己的 azure 租户(我无法直接控制)。要在客户端执行此操作,我们使用 adal.js 来回执行实际登录用户的操作,并在服务器端使用 UseWindowsAzureActiveDirectoryBearerAuthentication 来验证 azure 令牌。
Oauth 启动看起来像这样:
public static void RunAcademyOAuthStartup(IAppBuilder app)
{
if (ConfigurationManager.AppSettings["ida:Enabled"] == "1")
{
app.UseWindowsAzureActiveDirectoryBearerAuthentication(
new WindowsAzureActiveDirectoryBearerAuthenticationOptions
{
TokenValidationParameters = new System.IdentityModel.Tokens.TokenValidationParameters
{
ValidAudience = ConfigurationManager.AppSettings["ida:Audience"],
AuthenticationType = "ExternalAzureSSO"
},
Tenant = ConfigurationManager.AppSettings["ida:Tenant"]
}
);
}
var apiAccessTokenLifeTimeSeconds = 0;
if (!int.TryParse(ConfigurationManager.AppSettings["ApiAccessTokenLifetimeSeconds"], out apiAccessTokenLifeTimeSeconds))
{
apiAccessTokenLifeTimeSeconds = 1800; //set default to 30 minutes
}
var oAuthServerOptions = new OAuthAuthorizationServerOptions()
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/api/user/authenticate"),
AccessTokenExpireTimeSpan = TimeSpan.FromMinutes(apiAccessTokenLifeTimeSeconds),
Provider = new SimpleAuthorizationServerProvider(),
RefreshTokenProvider = new SimpleRefreshTokenProvider(),
AuthenticationType = "LocalApplication"
};
OAuthBearerOptions = new OAuthBearerAuthenticationOptions();
// Token Generation - setup the token authorization server
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(OAuthBearerOptions);
}
上面的代码与我几天来一直在搜索的数百个其他示例没有什么不同。
当我使用免费的 Azure 实例(通过我公司的 MSDN)时,这一切正常 - 我可以进行身份验证,令牌从 azure 返回,webapi 可以对其进行解码和验证,然后继续。
当我对客户的 P1 Azure 实例尝试此操作时,我的问题出现了 - 我可以进行身份验证,取回令牌,但我的 webapi 没有解码令牌。据我所知,没有记录任何错误。
目前我可以看到的主要内容是,当我获得 azure 令牌并使用 jwt.io 对其进行解码时,我可以看到“x5t”和“kid”值。根据我在网上找到的其他信息,我应该能够从https://login.microsoftonline.com/common/discovery/keys 获取最新的密钥,并在那里找到“x5t”和/或“kid”值......但我可以'吨。
这可能吗?什么会导致使用非通用密钥生成令牌?这是天蓝色应用注册中的配置项吗?我是否需要在 Web api 中的 UseWindowsAzureActiveDirectoryBearerAuthentication 配置中添加更多设置?
代币都是 v1
【问题讨论】:
-
你的
ida:Tenant值是多少? -
另外,您不应使用 Id 令牌对 API 进行身份验证,而应使用访问令牌。这需要您在 Azure AD 中注册两个应用程序,一个用于前端的 Native,一个用于 API 的 Web 应用程序/API。然后前端应获取访问令牌以调用 API。
-
另一个问题是你想支持任何 Azure AD 还是只支持一个?
-
您好 Juunas,我不确定我能否告诉您租户价值是什么 - 我认为我的客户不希望在公共论坛上直接发布(即使它是公共信息)。在 Azure 中注册 WebAPI 时,我已经阅读了相关内容,但我有两件事: 1. Id 令牌和访问令牌非常相似,我在 webapi 中有一些自定义代码,用于验证 id 令牌中的声明。 2. 整个过程对我的免费 azure 广告很有效,无需注册 api。我的应用程序的每个实例都只能与一个 azure 租户一起使用。
-
是的,你不需要说租户值,我只想知道它是
common还是租户ID。由于您已将其设置为客户租户 ID,因此它应该在启动时从您提到的 URL 加载签名密钥。所有租户都应使用相同的签名密钥,除非他们使用例如德国/中国 Azure 云。
标签: c# asp.net azure authentication