我正在尝试构建一个不允许匿名用户访问的ASP.NET MVC应用程序(除了要向经过身份验证的用户显示的自定义URL之外允许使用该应用程序。)
现在,我已经在azure门户网站(portal.azure.com)注册了我的应用,并且我想使用多个网址。我添加了两个条目:
我使用以下代码在启动时配置身份验证:
public void ConfigureAuth(IAppBuilder app) {
app.SetDefaultSignInAsAuthenticationType(
CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions {
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications {
SecurityTokenValidated = VerificaUtilizadorAutenticado,
AuthenticationFailed = TrataErroAutenticacao
}
});
}
一切似乎都运行良好,但在发布应用程序后,似乎我只能使用其中一个URI。我已经搜索过,似乎我可以使用OpenIdConnectAuthenticationOptions的RedirectUri属性来设置回复网址。所以,我已经尝试将其添加到设置中:
RedirectUri = "https://localhost/test",
不幸的是,这样做会打破一切,浏览器会卡在我的应用和MS之间。登录页面。由于用户已登录,因此会将用户重定向回我的应用程序。但是,似乎设置RedirectUri prop不会生成应用程序的身份验证cookie,因此它会将用户发送回登录页面。
如果我删除了RedirectUri,那么即使我尝试访问https://www.test.com网络应用,我也会被重定向到https://localhost/test网站。
我不确定是什么,但我错过了什么......有人可以帮忙吗?
感谢。
路易斯
答案 0 :(得分:3)
当您发送想要登录AAD登录端点(https://login.microsoftonline.com
)的用户时,您需要指定将用户(和授权码)重定向回的位置。
您可以通过两种方式指定:
您必须在登录网址中指定一个回复网址,该网址与您配置的其中一个网址完全匹配:
来自Authorization Code Grant Flow documentation:
https://login.microsoftonline.com/{tenant}/oauth2/authorize?
client_id=6731de76-14a6-49ae-97bc-6eba6914391e
&response_type=code
&redirect_uri=http%3A%2F%2Flocalhost%2Fmyapp%2F <-- this guy
&response_mode=query
&resource=https%3A%2F%2Fservice.contoso.com%2F
&state=12345
如果您未在登录网址中指定重定向URI,则该用户将被重定向到您应用注册中指定的第一个网址。这听起来不是那么糟糕,但是知道AAD将您的回复URL视为无序列表,因此根据您点击的服务器或数据的复制方式,您可能会在不同的登录尝试中观察到不同的重定向行为。这就是为什么始终在登录端点中指定redirect_uri
参数非常重要。
如果您使用ADAL libraries进行身份验证而不是示例代码中显示的库,我觉得您的许多问题都可以解决,但如果您不想使用这些,那么您需要分享更多细节,如身份验证过程的HTTP跟踪。
答案 1 :(得分:2)
好的,经过一番挖掘后,我注意到设置redirecturi时遇到的问题是我失踪了......斜线(/)。因此,将/添加到门户网站上定义的URL并将其放在选项对象的重定向文件中就足以使其适用于不同的URI ...