如果我在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中间件没有将其设置为真?
感谢您的帮助!
答案 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
})