指定重定向后,在AAD身份验证后无限重定向循环

时间:2017-06-06 18:52:08

标签: asp.net-mvc-5 azure-active-directory openid-connect adal katana

如果我在OpenIdConnectAuthenticationOptions中指定重定向URI,那么

app.UseOpenIdConnectAuthentication(
            new OpenIdConnectAuthenticationOptions
            {
                ClientId = clientId,
                Authority = Authority,
                PostLogoutRedirectUri = postLogoutRedirectUri,
                RedirectUri = redirectUri,

                Notifications = new OpenIdConnectAuthenticationNotifications()
                {
                    AuthenticationFailed = context =>
                    {
                        context.HandleResponse();
                        context.Response.Redirect("/Error?message=" + context.Exception.Message);
                        return Task.FromResult(0);
                    }
                }
            });

然后我得到一个无限的重定向循环。这只发生在我把它和独立的IIS服务器(我们的测试服务器)上。如果我删除AAD中的所有重播URL并保留它只为测试服务器设置,并从上面删除“RedirectUri = redirectUri”,我的问题就消失了。

我在这里有一个提琴手日志:https://drive.google.com/file/d/0B5Ap95E_wdyAa0RLLWloZ0dCaGM/view?usp=sharing

看来,当AAD的请求回到我的应用程序时,在抓取并使用令牌之前,Middle Ware只是将它反弹回302.同样可能重要的是,我有[Authorize]属性在路由和返回uri指向的mvc控制器上。如果我删除它,我不会遇到这个问题。

[UPDATE] 我尝试将应用程序移动到IIS的localhost安装,而不是使用iisexpress,以便我可以设置为像我在iis服务器上的SubApplication。在我的localhost上它执行相同的无限循环。我在一些遥测自定义事件中添加了[Authorize]属性的覆盖,并且能够在身份验证后将页面重新定向回应用程序httpContext.user.identity.IsAuthenticated = false。所以不知何故,OWIN中间件没有将其设置为真?

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

我能够找到解决问题的方法。最初我指的是我的回复网址指向网站的根目录。我的溃败配置如下所示:

  @RunWith(AndroidJUnit4.class)
public class MainActivityTest {

    private Context context;

    @Mock
    private HandleFirebaseMessages handleFirebaseMessages;

    @Rule
    public ActivityTestRule<MainActivity> activityTestRule =
            new ActivityTestRule<>(MainActivity.class);

    @Before
    public void init() {
        context = InstrumentationRegistry.getTargetContext();
        //MockitoAnnotations.initMocks(this);
        //handleFirebaseMessages = new HandleFirebaseMessages();
    }

     @Test
        public void handleFirebaseMessagesBigText() {
            HandleFirebaseMessages handleFirebaseMessages=new HandleFirebaseMessages();
            RemoteMessage remoteMessage = new RemoteMessage.Builder("token").addData("type","1").build();
            handleFirebaseMessages.onMessageReceived(remoteMessage);
            Map<String,String> data = new HashMap<>() ;
            data.put("type","1");
            Mockito.verify(handleFirebaseMessages).buildNotificationBigText(data);
        }

        @Test
        public void handleFirebaseMessagesBigPicture() {
            HandleFirebaseMessages handleFirebaseMessages=new HandleFirebaseMessages();
            RemoteMessage remoteMessage = new RemoteMessage.Builder("token").addData("type","2").build();
            handleFirebaseMessages.onMessageReceived(remoteMessage);
            Map<String,String> data = new HashMap<>() ;
            data.put("type","2");
            Mockito.verify(handleFirebaseMessages).buildNotificationBigPicture(data);
        }

}

如果我将“欢迎”添加到我的回复结尾,则可以使用。出于某种原因,如果我将回复网址留给网站的根目录并且选择了默认路由,它就会进入无限循环。

我还发现这仅适用于网站的子应用程序。我尝试将我的应用程序移动到iis中的独立站点,而不是我不必在回复URL中添加控制器名称。

例:
原始回复网址: mysite.mydomain.com/CustomApp

新回复网址 mysite.mydomain.com/CustomApp/Welcome

希望其他人能发现这个有用!

<强>更新

我发现问题的根源仍然来自这个mvc5错误:katanaproject.codeplex.com/workitem/197。我认为它已被修复但它没有,所以我将继续使用着名的Kentor Owin Cookie Saver:github.com/Sustainsys/owin-cookie-saver

答案 1 :(得分:-1)

使用CookieSecureOption的Never选项解决

app.UseCookieAuthentication(new CookieAuthenticationOptions()
            {
                CookieSecure = CookieSecureOption.Never
            })