您可以在自己的研发平台或工具平台嵌入免登访问DMS控制台链接,实现无需使用阿里云账号或RAM用户登录就可以直接访问DMS控制台,使用DMS的相关功能。本文介绍构造免登访问DMS控制台链接的操作步骤。

操作流程

  1. 创建访问DMS的RAM角色,并为其授权,再创建一个RAM用户(子账号)并为其授予AliyunSTSAssumeRoleAccess权限。创建及授权的详细信息,请参见准备工作
  2. 获取扮演角色的临时身份凭证,包含AccessKey ID、AccessKey Secret和SecurityToken,该凭证用于获取登录令牌(SigninToken)。具体的操作步骤,请参见步骤一:获取扮演角色的临时身份凭证
  3. 获取SigninToken,用于构造免登录访问链接。具体的操作步骤,请参见步骤二:获取SigninToken
  4. 构造免登录访问链接。具体的操作步骤,请参见步骤三:构造免登录访问链接
Java代码示例如下。
 /*
  创建子账号、授权账号
 */
  String accountId = "主账号";
 // 用来访问DMS产品的Role,根据您的需求添加AliyunDMSReadOnlyAccess(只读),AliyunDMSFullAccess权限
  String ramRole = "准备工作中创建的Role";
 // 子账号的AccessKey ID、AccessKey Secret,还需要AliyunSTSAssumeRoleAccess权限
  String accessKeyId = "";
  String accessKeySecret = "";
 /*
  Step1 通过AssumeRole接口获取临时的AccessKey ID、AccessKey Secret和SecurityToken
 */
  AssumeRoleResponse.Credentials credentials = assumeRole(accountId, accessKeyId, accessKeySecret, ramRole);
  System.out.println("Expiration: " + credentials.getExpiration());
  System.out.println("Access Key Id: " + credentials.getAccessKeyId());
  System.out.println("Access Key Secret: " + credentials.getAccessKeySecret());
  System.out.println("Security Token: " + credentials.getSecurityToken());

  /*
  Step2 获取SigninToken
  */
  String signInToken = getSignInToken(credentials.getAccessKeyId(),
  credentials.getAccessKeySecret(),
  credentials.getSecurityToken());
  System.out.println("Your SigninToken is: " + signInToken);

 /*
  Step3 构造免登录访问链接,例如DMS控制台首页
 */
  String pageUrl = getDmsLoginUrl("https://dms.aliyun.com", signInToken);
  System.out.println("Your PageUrl is : " + pageUrl);

准备工作

说明 若您已具备如下全部条件,可直接根据步骤一、二、三进行操作。

步骤一:获取扮演角色的临时身份凭证

以RAM用户或RAM角色调用AssumeRole接口,获取扮演角色的临时身份凭证。关于AssumeRole接口的更多信息,请参见AssumeRole

Java代码示例如下。
    /**
     * 通过AssumeRole接口获取用户临时身份
     *
     * @param accountId
     * @param accessKeyId
     * @param accessKeySecret
     * @param ramRole
     * @return
     * @throws ClientException
     */
    private static AssumeRoleResponse.Credentials assumeRole(String accountId, String accessKeyId,
                                                             String accessKeySecret, String ramRole)
        throws ClientException {
        String defaultRegion = "cn-hangzhou";
        IClientProfile profile = DefaultProfile.getProfile(defaultRegion, accessKeyId, accessKeySecret);
        DefaultAcsClient client = new DefaultAcsClient(profile);
        AssumeRoleRequest request = new AssumeRoleRequest();
        // ARN是角色的全局资源描述符,用来指定具体角色
        request.setRoleArn(getRoleArn(accountId, ramRole));
        // 用户自定义参数。此参数用来区分不同的令牌,可用于用户级别的访问审计,格式:^[a-zA-Z0-9\.@\-_]+$
        request.setRoleSessionName("session-name");
        // 指定的过期时间,单位为秒。过期时间范围:900~3600,默认值为3600
        request.setDurationSeconds(3600L);
        AssumeRoleResponse response = client.getAcsResponse(request);
        return response.getCredentials();

    }

步骤二:获取SigninToken

调用GetSigninToken接口,获取SigninToken。关于GetSigninToken接口的更多信息,请参见GetSigninToken

Java代码示例如下。
  /**
     * 使用安全令牌获取SigninToken
     *
     * @param accesskeyId
     * @param accessKeySecret
     * @param securityToken
     * @return
     * @throws IOException
     * @throws URISyntaxException
     */
    private static String getSignInToken(String accesskeyId, String accessKeySecret, String securityToken)
        throws IOException, URISyntaxException {
        URIBuilder builder = new URIBuilder(SIGN_IN_DOMAIN);

        builder.setParameter("Action", "GetSigninToken")
            .setParameter("AccessKeyId", accesskeyId)
            .setParameter("AccessKeySecret", accessKeySecret)
            .setParameter("SecurityToken", securityToken)
            .setParameter("TicketType", "normal");

        HttpGet request = new HttpGet(builder.build());
        CloseableHttpClient httpclient = HttpClients.createDefault();

        try (CloseableHttpResponse response = httpclient.execute(request)) {
            if (response.getStatusLine().getStatusCode() == HttpStatus.SC_OK) {
                String context = EntityUtils.toString(response.getEntity());
                JSONObject jsonObject = JSON.parseObject(context);
                return jsonObject.getString("SigninToken");
            } else {
                System.out.println(response.getStatusLine());
            }
        }
        return null;
    }

步骤三:构造免登录访问链接

说明 获取的SigninToken在构造访问链接时只能使用一次,如有业务需要再次使用SigninToken,请重新获取。
Java代码示例如下。
请求示例:
    private static String getDmsLoginUrl(String pageUrl, String signInToken) throws URISyntaxException {
        URIBuilder builder = new URIBuilder(SIGN_IN_DOMAIN);
        builder.setParameter("Action", "Login");
        // 登录失效跳转的地址,一般配置为自建WEB配置302跳转的URL
        builder.setParameter("LoginUrl", "https://signin.aliyun.com/login.htm");
        // 实际访问DMS的页面
        builder.setParameter("Destination", pageUrl);
        builder.setParameter("SigninToken", signInToken);
        HttpGet request = new HttpGet(builder.build());
        return request.getURI().toString();
    }
返回示例:
Expiration: 2020-11-30T06:16:20Z
Access Key Id: STS.NT7L6Jp5Y8W9LNvGQku2x****
Access Key Secret: 4nU8F6rv8MCDR8tygMDnXvN9yCNBCVrxnqArj1n1****
Security Token: CAIS/gF1q6Ft5B2yfSjIr5e****+nep4j5XSTmjHo1E+eb1Ujo7xijz2IH9IeXhpB****/43nWlU7PkYlrloRoReREvCKM1565kSqFn6O11Qf****+5qsoasPETOITyZtZagToeUZdfZfejXGDKgvyRvwLz****/Vli+S/OggoJmadJlNWvRL0AxZrFsKxBltdUROF****+pKWSKuGfLC1dysQcO4gEWq4bHm5zAs0OH1QOhlrVP+N+qfqLJNZc8YM1NNP6ux/Fze6b71ypd1gNH7q8ejtYfpmua74jBXgUAuU3faraOrYd1SwZ9Z7knH****/n6ifBjpvw9Hlk0R9OcVhqAAXpZx****+STGa8vctRwyTWdMM5LByes3cr1D46jaj0****/lTMkoXCwjMlCs7sc+DA9xjJCcl57eKC7A3ThnJAWQyyeKZfIGgeHN7yUS5ND8r7TBn6bMUqwvfVX****/cbkzBX6iV6jrataHZPZdtQYHH6GgvQ5XZUZJjoD****
Your SigninToken is: 06ec409b9d8c48f6ac5dcd18a0513ee1dhUkhcRn5CMsDqffC4wxsuFt9xjYtYePmYTHEWSMVKLFyXXnSq3IUbon1v46wCmKPwrAejDvw2i8rilolPSuxpKRDxz****
Your PageUrl is : http://signin.aliyun.com/federation?Action=Login&LoginUrl=https%3A%2F%2Fsignin.aliyun.com%2Flogin.htm&Destination=https%3A%2F%2Fdms.aliyun.com&SigninToken=06ec409b9d8c48f6ac5dcd18a0513ee1dhUkhcRn5CMsDqffC4wxsuFt9xjYtYePmYTHEWSMVKLFyXXnSq3IUbon1v46wCmKPwrAejDvw2i8rilolPSuxpKRDxzD****
免登录访问链接(PageUrl)的格式示例如下。
http://signin.aliyun.com/federation?Action=Login
                            &LoginUrl=<登录失效跳转的地址,一般配置为自建WEB配置302跳转的URL>
                            &Destination=<实际访问DMS服务页面>
                            &SigninToken=<获取的登录TOKEN>
说明 Destination对应的DMS服务页面,与TicketType类型有关。
  • 若类型为normal,则对应的DMS域名为http://dms.aliyun.com
  • 若类型为mini,则一般应用于BID虚拟商。对应的域名如下:
    • http://dms-jst4service.aliyun.com
    • http://dms-Itwo4service.aliyun.com

后续步骤

通过构造的免登录访问链接(PageUrl)进入DMS控制台。效果图如下所示:jichenghoudenglutu