【发布时间】:2018-06-17 23:03:28
【问题描述】:
我正在为我的 ASP.Net Core 2.0 Web 应用程序实施 OpenID Connect 身份验证。该应用程序在启用了 Windows 身份验证的 IIS 站点内运行。如果用户在登录到企业网络时访问应用程序,我希望他们不必在 Azure AD 对话框中输入用户名,而是让应用程序从存储在 HttpContext 中的用户名中派生它,并且将其作为 login_hint 传递给 AD 登录链接。下面是我试图实现所需行为的代码:
services.AddAuthentication(options =>
{
options.DefaultChallengeScheme = OpenIdConnectDefaults.AuthenticationScheme;
options.DefaultSignInScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultAuthenticateScheme = CookieAuthenticationDefaults.AuthenticationScheme;
})
.AddOpenIdConnect(options =>
{
options.Authority = "https://login.microsoftonline.com/<removed>";
options.ClientId = "<removed>";
options.ResponseType = OpenIdConnectResponseType.IdToken;
options.CallbackPath = "/auth/signin-callback";
options.Events = new OpenIdConnectEvents
{
OnRedirectToIdentityProvider = context =>
{
if(context?.HttpContext?.User?.Identity?.Name != null)
context.ProtocolMessage.SetParameter("login_hint", context.HttpContext.User.Identity.Name.Replace("domain\\", "") + "@domain.com");
return Task.FromResult(0);
}
};
}
).AddCookie();
但是,这不起作用。只要用户点击受 [Authorize] 属性保护的控制器,框架就会发现用户已经通过 IIS 的身份验证,并且不会重定向到 Azure AD 登录。
如果我在属性中指定认证方案
[Authorize(AuthenticationSchemes = OpenIdConnectDefaults.AuthenticationScheme)]
应用重定向到 AD 登录,但 context.HttpContext.User.Identity.Name 是 null,这表明 IIS 身份验证没有发生。
我还尝试在 Startup.cs 的 ConfigureServices 方法中禁用自动身份验证
services.Configure<IISOptions>(options => {options.AutomaticAuthentication = false;});
同样的效果——OpenID Connect 启动,但context.HttpContext.User.Identity.Name 是null。如果我在 Kestrel 上运行应用程序或在 IIS 站点上关闭 Windows Auth,也会发生同样的情况。
有没有一种方法可以兼得——在可用时进行 IIS 身份验证,但在使用 IIS 为 login_hint 参数建立的身份时仍继续执行 OpenId Connect?
提前致谢!
【问题讨论】:
标签: authentication asp.net-core openid-connect