【问题标题】:How to Decode the SAML Token getting From Azure in Java?如何在 Java 中解码从 Azure 获取的 SAML 令牌?
【发布时间】:2019-08-26 12:23:09
【问题描述】:
  1. 我在 Microsoft Azure 上有一个托管的非图库应用程序。
  2. 我已在 Azure AD 中完成 SAML 配置(使用 SAML 2.0 协议)
  3. 我的应用程序在 Java 中运行(运行时 7)
  4. 我将 userPrincipalName 作为编码值。

如何解码该编码值并检索实际值?

我已经使用 SAML Parser 测试了响应,它在 NameID 标记中显示了正确的值。

我期待 SAML 响应 NameID 标记中显示的值,但我得到的是编码值。

我尝试了以下代码,但输出与预期不符。我期待一个电子邮件格式的字符串。

【问题讨论】:

  • 我可以知道您从哪里获得 SAMLResponse 值吗?好像不是普通的 SAMLResponse 。
  • 我在 标签中得到这个值。像这样:hEUnPY0HVf5jXb4FoD7BgjZTAoh0RQgyOKnoP5HOhOA=名称ID>。这是在 AZURE 端配置的用户的邮件 ID。
  • 它是有线的,当我解码 SAMLResponse 时,有一个未在 中编码的电子邮件 ID,请在我的答案中查看捕获。
  • 是的,我已经附加了捕获。
  • 我能够解码整个 SAML 响应。但 NameID 值仍然是加密的

标签: java azure azure-active-directory single-sign-on saml


【解决方案1】:

SAML 令牌在传输时采用 Base64 编码。如果您使用的是 java 6,只需使用下面的代码来解码您的 SAML 令牌:

import java.io.UnsupportedEncodingException;

import javax.xml.bind.DatatypeConverter;

public class Base64test {

    public static void main(String[] args) {
        String SAML_resp = "<SAML RESP>";
        byte[] decoded = DatatypeConverter.parseBase64Binary(SAML_token);
        try {
            System.out.println(new String(decoded, "UTF-8"));
        } catch (UnsupportedEncodingException e) {

            e.printStackTrace();
        }
    }
}

【讨论】:

  • 感谢您的帮助。此解决方案需要 Java 8。我的应用程序在 Java 6 上。
  • 嗨,我已经更新了答案。如果有帮助请标记我:)
  • 嗨,我已经用你的解决方案更新了我的问题,你可以看到截图。我没有得到准确的解码字符串。
  • 您好,我注意到您的 NameID 格式是 "urn:oasis:names:tc:SAML:2.0:nameid-format:transient" ,属于瞬态标识符。瞬态标识符是IdP告诉SP会话中的用户已被授权访问SP上的资源,但用户的身份实际上并不提供给SP。例如,断言就像“匿名(Idp 不告诉 SP 他是谁)有权访问 SP 上的 /resource”。 SP得到了它并让浏览器访问它,但仍然不知道Anonymity的真实姓名。
  • 顺便说一句,这篇文章解释得很好:stackoverflow.com/questions/11693297/…
【解决方案2】:

使用OpenSAML 2.x,它将适用于 Java 1.6。这是一个example,它显示了通过 OpenSAML v2 解析和验证 SAML 响应

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-27
    • 1970-01-01
    相关资源
    最近更新 更多