我一直在寻找一种方法将Azure ACS家庭领域发现页面集成到我们的ASP.Net MVC5应用程序登录页面中,而不是使用ACS本身托管的默认页面。
我想要的是像这里建议的那样:
我正在.Net 4.5.1 Azure Web角色上构建一个MVC 5.1,它需要对来自多个企业身份提供商的用户进行身份验证 - 一些使用AAD,一些使用ADFS - 该列表将随着时间的推移而增长。最初,这很简单,可以使用Azure ACS作为联合提供程序进行设置。它提供了一个家庭领域发现(HRD)页面和流程。
当我尝试按照说明直接将HRD添加到我的登录页面时(按照ACS应用程序集成页面中使用Home Realm Discovery Metadata Feed和一些示例HTML + JS的说明),事情变得复杂了。我可以按照自己的意愿展示HRD按钮,但是我正在努力将登录过程连接到OWIN WsFederation设置,在我的应用程序中当前只知道ACS WsFederationMetadataUrl。
我目前在我的ConfigureAuth方法中得到了这个:
app.UseWsFederationAuthentication(wsFederationOptions: new WsFederationAuthenticationOptions()
{
Notifications = new WsFederationAuthenticationNotifications()
{
RedirectToIdentityProvider = (context) =>
{
context.ProtocolMessage.Whr = ".com";
return Task.FromResult(0);
}
},
MetadataAddress = CloudConfigurationManager.GetSetting("Authentication.WsFederationMetadataUrl"),
Wtrealm = CloudConfigurationManager.GetSetting("Authentication.Realm"),
AuthenticationMode = AuthenticationMode.Passive,
});
其中.com是我的ACS中其中一个IdP的域,它恰好是我们自己的AAD。但这不起作用。这种情况可以起作用吗?我发现了一个相关的堆栈帖子,其中讨论了使用Ws-Federation OWIN Middleware跳过家庭领域发现并允许通过用户操作设置Whr参数但是到目前为止我还没有能够让它与Whr一起工作硬编码。
Skipping home realm discovery with Ws-Federation OWIN Middleware
我已经更改了示例HTML + JS中的按钮,以便它们发布到/ Account / ExternalLogin控制器操作并以这种方式进入OWIN管道:
// POST: /Account/ExternalLogin
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public ActionResult ExternalLogin(string provider, string homeRealm, string returnUrl)
{
// Request a redirect to the external login provider
return new ChallengeResult(provider, homeRealm, Url.Action("ExternalLoginCallback", "Account", new { ReturnUrl = returnUrl }));
}
而不是使用cookie并导航到所选择的家庭领域的登录页面(来自ACS的锅炉板HTML + JS):
// Sets a cookie to remember the chosen identity provider and navigates to it.
function IdentityProviderButtonClicked() {
SetCookie(this.getAttribute("name"));
window.location = this.getAttribute("id");
return false;
}