本地JAVA开发页面使用AzureAD(AAD)验证登录

我们前一篇文章介绍了本地使用APS.NET开发的WEB服务如何使用AZURE AD(AAD)验证登录,今天我们主要介绍本地使用JAVA开发的WEB服务如何使用AAD验证登录。其实方法跟ASP.NET是一样的,需要在AZURE中注册服务才可以,然后得到对应Client ID 、Security ID、URL等信息。具体见下:

我们首先将代码整理一下,然后使用Eclipse打开即可,需要注意的是,我们建议使用Eclipse打开的时候使用Maven方式,这样打开的话会自动下载对应的jar包。很是方便。

p_w_picpath

我们选择Import导入即可

p_w_picpath

我们选择使用Maven

p_w_picpath

选择项目路径:

p_w_picpath

导入的过程中会自动下载一些关联的jar包,所以比较慢

p_w_picpath

p_w_picpath

该过程会在系统的用户下的m2目录下的repository目录下会下载一些jar包的信息

p_w_picpath

我们发现目录的信息也会越来越多

p_w_picpath

p_w_picpath

项目导入后,我们接下来是配置azure 的应用程序;打开Active Directoty----单击进去AD---应用程序---添加

任意定义一个名称

p_w_picpath

然后定义登录的URL;该URL是我们java项目的默认访问url

p_w_picpath

新建完成后,我们可以在配置界面进行查看及修改信息

clip_p_w_picpath001

clip_p_w_picpath002

我们首先要复制客户端id

fdfc7150-2acd-4a98-8f69-b688dfbdc71b

clip_p_w_picpath001[4]

然后接下来要复制秘钥

nQmQMQEbRqaDkdKvRnk99zuOQ23ogLkiIJ73s/7QMgA=

clip_p_w_picpath002[4]

第三我们需要查看token信息

单击查看端点

clip_p_w_picpath003

https://login.chinacloudapi.cn

clip_p_w_picpath004

我们接下来顺便看看用户

我们提前将自定义添加进去了,所以用户的格式是我本地 域的给说

clip_p_w_picpath005

clip_p_w_picpath006

接下来我们还需要记录一个信息

就是azure的登录域信息

clip_p_w_picpath001[6]

接下来我们需要根据需求先修改配置文件 web.xml 打开的方式以txt打开

Authority也需要设置:

国内的为:https://login.chinacloudapi.cn

global: https://windows.net

p_w_picpath

根据上面的记录信息进行修改

以下信息为国际版本的所需要的登录端点值

<param-value>https://login.windows.net/</param-value>

我们测试环境为21世界互联的国内版本azure,所以我们需要修改,修改的格式为我们刚才查看的端点信息,所以要修改以下格式

<param-value>https://login.chinacloudapi.cn/</param-value>

clip_p_w_picpath001[8]

接下来就是修改TENANT_NAME了,该值为我们的域名称

修改前

<param-value>YOUR_TENANT_NAME</param-value>

修改后

<param-value>ixmsoft.partner.onm</param-value>

修改后

最正确的改法应该是:将该值复制对应的id,后面的id都是一样的,所以复制任意一个都可以

<param-value>8a46539c-3b09-47f5-8d2e-283d79f7e094</param-value>

clip_p_w_picpath002[6]

所以更改后

clip_p_w_picpath003[4]

接下来修改client_id

修改前:

<param-value>YOUR_CLIENT_ID</param-value>

修改后:

<param-value>fdfc7150-2acd-4a98-8f69-b688dfbdc71b</param-value>

clip_p_w_picpath004[4]

最后修改Client_securt id

修改前:

<param-value>YOUR_CLIENT_SECRET</param-value>

修改后

<param-value>nQmQMQEbRqaDkdKvRnk99zuOQ23ogLkiIJ73s/7QMgA=</param-value>

clip_p_w_picpath005[4]

最后记得修改

BasicFilter.java

的配置文件

国际版本使用graph.windows.net,国内版本使用graph.chinacloudapi.cn

https://msdn.microsoft.com/en-us/office/office365/api/o365-china-endpoints?f=255&MSPPError=-2147217396#AzureActiveDirectoryGraphAPI

clip_p_w_picpath006[4]

保存后,我们运行tomcat server

clip_p_w_picpath007

单击secure page

p_w_picpath

登录提示跳转到error页面

clip_p_w_picpath001[10]

clip_p_w_picpath002[8]

clip_p_w_picpath003[6]

正确的应该是可以去到用户的登录信息,然后返回到index页面

由于之前在程序中 请求地址为global地址,而且在修改自己信息时也存在错误,所以出现了登陆问题。

现在我已经把代码修改好了,您只需要在web.xml文件中修改上自己的信息即可。

而且要是在执行时报证书错误您可以按照如下教程在jdk中导入SSL证书。

1 下载证书:http://www.wosign.com/Root/index.htm#

clip_p_w_picpath001

2.将证书后缀名修改为.cer,并保存到jdk1.8.0_05\jre\lib\security 目录中:

clip_p_w_picpath002

3在cmd 进入到security目录中执行以下命令:

D:\Development_Environment\java\jdk\jre\lib\security
keytool -keystore cacerts -importcert -alias cnnicc -file WS_CA1_NEW.cer

clip_p_w_picpath003[8]

4.输入如下密码:changeit

clip_p_w_picpath004

clip_p_w_picpath005[6]

5最后输入yes并导入成功。

然后修改eclipse 中的jre所应用证书的路劲

最后登录测试

clip_p_w_picpath006[6]

clip_p_w_picpath007[4]

clip_p_w_picpath008

http://blchen.com/different-between-china-azure-and-global-azure-for-developers/

国际版本的Azure登录测试

如果是国际版本的话,我们应该选择修改以下内容,通过以下链接进行配置修改

其实说通俗了就是将整个项目中的 chinacloudapi.cn替换成windows.net

Aadcontrolleer.java

clip_p_w_picpath001[12]

Basicfilter.java

clip_p_w_picpath002[10]

clip_p_w_picpath003[10]

Web.xml

clip_p_w_picpath004[6]

clip_p_w_picpath005[8]

------------------------------------------------------------------------------------------------------------------------------

打印显示登陆用户,不显示登陆列表

如果需要打印显示登陆用户的信息,我们需要根据以下信息进行修改

只需要在AadController.java 文件中将 请求graph  api 的参数变换一下就可以。

修改方法如下:

clip_p_w_picpath006

修改后为

clip_p_w_picpath007

注意修改以后,会在转化为json 字符串中报错因为获取一个用户信息与获取多个用户信息的返回字符串发生了变化,,到时您只需要根据自己的需要修改即可。

关于使用graph api 的方法您可以参考此地址:https://azure.microsoft.com/en-us/documentation/articles/active-directory-graph-api-quickstart/

修改的为 AadController.java

根据以下格式进行修改,

通过以下代码直接覆盖接口,但是需要区分global和21vnet的api端口

以下代码为 21世纪互联的代码

//add格式的都是添加的
private String getUsernamesFromGraph(String accessToken, String tenant) throws Exception {
// URL url = new URL(String.format("https://graph.chinacloudapi.cn/%s/users?api-version=2013-04-05", tenant,
URL url = new URL(String.format("https://graph.chinacloudapi.cn/%s/me?api-version=2013-04-05", tenant,
accessToken)); //add
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Set the appropriate header fields in the request header.
conn.setRequestProperty("api-version", "2013-04-05");
conn.setRequestProperty("Authorization", accessToken);
conn.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
String goodRespStr = HttpClientHelper.getResponseStringFromConn(conn, true);
// logger.info("goodRespStr ->" + goodRespStr);
int responseCode = conn.getResponseCode();
JSONObject response = HttpClientHelper.processGoodRespStr(responseCode, goodRespStr);
JSONObject userJson = new JSONObject();//add
userJson = JSONHelper.fetchDirectoryObjectJSONObject(response);//add
// JSONArray users = new JSONArray();
//
// users = JSONHelper.fetchDirectoryObjectJSONArray(response);
StringBuilder builder = new StringBuilder();//add
User user = new User();//add
JSONHelper.convertJSONObjectToDirectoryObject(userJson, user);//add
builder.append(user.getUserPrincipalName() + "<br/>");//add
// for (int i = 0; i < users.length(); i++) {
// JSONObject thisUserJSONObject = users.optJSONObject(i);
// user = new User();
// JSONHelper.convertJSONObjectToDirectoryObject(thisUserJSONObject, user);
// builder.append(user.getUserPrincipalName() + "<br/>");
// }
return builder.toString();
}
}

以下代码为global代码

private String getUsernamesFromGraph(String accessToken, String tenant) throws Exception {
// URL url = new URL(String.format("https://graph.windows.net/%s/users?api-version=2013-04-05", tenant,
URL url = new URL(String.format("https://graph.windows.net/%s/me?api-version=2013-04-05", tenant,
accessToken));
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// Set the appropriate header fields in the request header.
conn.setRequestProperty("api-version", "2013-04-05");
conn.setRequestProperty("Authorization", accessToken);
conn.setRequestProperty("Accept", "application/json;odata=minimalmetadata");
String goodRespStr = HttpClientHelper.getResponseStringFromConn(conn, true);
// logger.info("goodRespStr ->" + goodRespStr);
int responseCode = conn.getResponseCode();
JSONObject response = HttpClientHelper.processGoodRespStr(responseCode, goodRespStr);
JSONObject userJson = new JSONObject();//add
userJson = JSONHelper.fetchDirectoryObjectJSONObject(response);//add
// JSONArray users = new JSONArray();
//
// users = JSONHelper.fetchDirectoryObjectJSONArray(response);
StringBuilder builder = new StringBuilder();//add
User user = new User();//add
JSONHelper.convertJSONObjectToDirectoryObject(userJson, user);//add
builder.append(user.getUserPrincipalName() + "<br/>");//add
// for (int i = 0; i < users.length(); i++) {
// JSONObject thisUserJSONObject = users.optJSONObject(i);
// user = new User();
// JSONHelper.convertJSONObjectToDirectoryObject(thisUserJSONObject, user);
// builder.append(user.getUserPrincipalName() + "<br/>");
// }
return builder.toString();
}
}

clip_p_w_picpath008[4]