重定向到 java 网络应用程序后无法获取 AuthenticationResult
Unable to get the AuthenticationResult after redirecting to java web-app
我正在尝试使用 openidconnect 方法将 azure ad 集成到 java 网络应用程序中。我的 web 应用程序部署在 weblogic 应用程序服务器上。
我使用的基本代码来自微软github repo:Link
集成后,我能够将我的登录页面重定向到 Microsoft 登录页面,输入凭据,然后当 Microsoft 重定向回我的登录页面时,它位于控制器下方,这是我的重定向回复 URL,这里的结果对象 (AuthenticationResult) 为空。会话对象似乎没有名为 'principle' 的属性。我不确定我哪里出错了,谁能给我指出正确的方向?
@Controller
@RequestMapping("/jsp/MyClientControllerServlet")
public class AadController {
private static Logger logger = Logger.getLogger(AadController.class);
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
public String getDirectoryObjects(ModelMap model, HttpServletRequest httpRequest) {
logger.info("Starting getDirectoryObjects");
HttpSession session = httpRequest.getSession();
logger.info("session: "+session);
//The principle session name variable has the string 'principle'.
//I am not sure if this is a static attribute that applies to all applications.
//I guess this attribute is not available on my HttpSession which is why my AuthenticationResult is null
AuthenticationResult result = (AuthenticationResult) session.getAttribute(AuthHelper.PRINCIPAL_SESSION_NAME);
if (result == null) {
model.addAttribute("error", new Exception("AuthenticationResult not found in session."));
return "/error";
} else {
System.out.println("Login session success");
更新#1:我试图通过枚举来打印我的 HttpSession 的内容,我发现它只有一个名为 'states' 的属性,它也是空的。
来自我的日志:
INFO BasicFilter:81 - doFilter
INFO BasicFilter:134 - processAuthenticationData
INFO AuthenticationAuthority:149 - [Correlation ID: 546546454-18e3-499e-8cc9-0ABCDf3a3584] Instance discovery was successful
DEBUG DispatcherServlet:693 - DispatcherServlet with name 'mvc-dispatcher' processing POST request for [/myPortal/jsp/MyClientControllerServlet]
DEBUG DefaultAnnotationHandlerMapping:221 - Mapping [/jsp/MyClientControllerServlet] to HandlerExecutionChain with handler [com.microsoft.aad.adal4jsample.AadController@50f6da2b] and 2 interceptors
DEBUG HandlerMethodInvoker:173 - Invoking request handler method: public java.lang.String com.microsoft.aad.adal4jsample.AadController.getDirectoryObjects(org.springframework.ui.ModelMap,javax.servlet.http.HttpServletRequest)
INFO AadController:54 - Starting getDirectoryObjects
INFO AadController:56 - session: weblogic.servlet.internal.session.MemorySessionData@17d119dd
INFO AadController:61 - states : {}
更新 #2:
我尝试通过枚举来打印 HttpServletRequest 对象的属性,其中一个属性称为 error,它具有此值。
INFO AadController:81 - error : com/nimbusds/jose/shaded/json/parser/ParseException
按照@Allen Wu 的建议添加更多日志后,我终于能够获得一个明显的堆栈跟踪:
Caused by: java.lang.UnsupportedClassVersionError: com/nimbusds/jose/shaded/json/parser/ParseException : Unsupported major.minor version 52.0
nimbusds site 说他们的最新版本支持 JDK 7+ 版本,但最新的 jar 版本 9.9.3 仅支持 JDK 8+,因此出现上述错误。在我更换为 7.8 版本(随机选择较低版本)后,应用程序立即运行。
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>7.8</version>
</dependency>
我正在尝试使用 openidconnect 方法将 azure ad 集成到 java 网络应用程序中。我的 web 应用程序部署在 weblogic 应用程序服务器上。
我使用的基本代码来自微软github repo:Link
集成后,我能够将我的登录页面重定向到 Microsoft 登录页面,输入凭据,然后当 Microsoft 重定向回我的登录页面时,它位于控制器下方,这是我的重定向回复 URL,这里的结果对象 (AuthenticationResult) 为空。会话对象似乎没有名为 'principle' 的属性。我不确定我哪里出错了,谁能给我指出正确的方向?
@Controller
@RequestMapping("/jsp/MyClientControllerServlet")
public class AadController {
private static Logger logger = Logger.getLogger(AadController.class);
@RequestMapping(method = { RequestMethod.GET, RequestMethod.POST })
public String getDirectoryObjects(ModelMap model, HttpServletRequest httpRequest) {
logger.info("Starting getDirectoryObjects");
HttpSession session = httpRequest.getSession();
logger.info("session: "+session);
//The principle session name variable has the string 'principle'.
//I am not sure if this is a static attribute that applies to all applications.
//I guess this attribute is not available on my HttpSession which is why my AuthenticationResult is null
AuthenticationResult result = (AuthenticationResult) session.getAttribute(AuthHelper.PRINCIPAL_SESSION_NAME);
if (result == null) {
model.addAttribute("error", new Exception("AuthenticationResult not found in session."));
return "/error";
} else {
System.out.println("Login session success");
更新#1:我试图通过枚举来打印我的 HttpSession 的内容,我发现它只有一个名为 'states' 的属性,它也是空的。
来自我的日志:
INFO BasicFilter:81 - doFilter
INFO BasicFilter:134 - processAuthenticationData
INFO AuthenticationAuthority:149 - [Correlation ID: 546546454-18e3-499e-8cc9-0ABCDf3a3584] Instance discovery was successful
DEBUG DispatcherServlet:693 - DispatcherServlet with name 'mvc-dispatcher' processing POST request for [/myPortal/jsp/MyClientControllerServlet]
DEBUG DefaultAnnotationHandlerMapping:221 - Mapping [/jsp/MyClientControllerServlet] to HandlerExecutionChain with handler [com.microsoft.aad.adal4jsample.AadController@50f6da2b] and 2 interceptors
DEBUG HandlerMethodInvoker:173 - Invoking request handler method: public java.lang.String com.microsoft.aad.adal4jsample.AadController.getDirectoryObjects(org.springframework.ui.ModelMap,javax.servlet.http.HttpServletRequest)
INFO AadController:54 - Starting getDirectoryObjects
INFO AadController:56 - session: weblogic.servlet.internal.session.MemorySessionData@17d119dd
INFO AadController:61 - states : {}
更新 #2: 我尝试通过枚举来打印 HttpServletRequest 对象的属性,其中一个属性称为 error,它具有此值。
INFO AadController:81 - error : com/nimbusds/jose/shaded/json/parser/ParseException
按照@Allen Wu 的建议添加更多日志后,我终于能够获得一个明显的堆栈跟踪:
Caused by: java.lang.UnsupportedClassVersionError: com/nimbusds/jose/shaded/json/parser/ParseException : Unsupported major.minor version 52.0
nimbusds site 说他们的最新版本支持 JDK 7+ 版本,但最新的 jar 版本 9.9.3 仅支持 JDK 8+,因此出现上述错误。在我更换为 7.8 版本(随机选择较低版本)后,应用程序立即运行。
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>7.8</version>
</dependency>