Как реализовать Tableau Trusted Authentication?

1

1) Пользователям предлагается войти в Tableau при просмотре встроенной панели мониторинга в веб-приложении.

2) Если они закроют свой браузер, начнут другой сеанс браузера или позволят файлу Tableau истечь, им будет предложено снова войти в систему.

3) В течение дня вам может быть предложено войти несколько раз при попытке просмотра панелей мониторинга. Это быстро становится раздражающим и утомительным.

Tableau предлагает решение под названием "Trusted Authentication", которое обходит процесс входа в систему вручную. После недели отладки и устранения неполадок, я смог сделать это. Я не мог найти никаких решений по Stackoverflow, поэтому я хотел поделиться своими знаниями о том, как я это сделал, в надежде помочь другим.

Теги:
tableau
embed

1 ответ

2

Ссылка на таблицу, как работает доверенная аутентификация

Изображение 174551

Обзор высокого уровня о том, как я реализовал Доверенную Аутентификацию

1) Сервер Tableau должен иметь запись в файле wgserver.trusted_hosts с именем хоста вашего веб-приложения, чтобы все это работало.

2) Передаются три важных параметра:

username          212456449
server            http://[server]
target_site       YourTargetSiteName

3) Если HTTP-запрос POST действителен и пользователь имеет правильную лицензию Tableau, Tableau создает билет с 48 уникальными символами, действительный только в течение 3 минут.

4) Я программно добавляю билет на 48 уникальных символов во встроенный JavaScript прямо перед тем, как Tableau его выкупает.

Как работает код в моем веб-приложении

Я создал класс TrustedAuth, который содержит два метода: requestTicket() и addTicket(). requestTicket() - это асинхронный метод, который принимает три обязательных параметра (sso, server, site). HTTP POST запускается и ждет ответа. Если ответ Tableau - -1, HTTP-рукопожатие не выполнено или пользователь недействителен. Если он действителен, ответом будет зашифрованная строка из 48 символов.

addTicket() - это синхронный метод, который принимает два параметра (ticket, reportLink). Этот метод берет зашифрованный билет из 48 символов и добавляет его во встроенный JavaScript (reportLink).

Веб-приложение отправляет запрос HTTP GET в Tableau, который включает в себя встроенный JavaScript (reportLink) с зашифрованным билетом. Tableau Server выкупает тикет, создает сеанс, регистрирует пользователя, запрос на вход в систему не отображается

Класс TrustedAuth

public class TrustedAuth
{
    public async Task<string> requestTicket(int sso, string server, string site)
    {
        try
        {
            //Assign parameters and values
            var values = new List<KeyValuePair<string, string>>();
            values.Add(new KeyValuePair<string, string>("username", sso.ToString()));
            values.Add(new KeyValuePair<string, string>("target_site", site));

            //Web Application is HTTP and Tableau is HTTPS, there are certification issues. I need to fake the certs out and return them as true.
            System.Net.ServicePointManager.ServerCertificateValidationCallback = (senderX, certificate, chain, sslPolicyErrors) => { return true; };

            //Instantiate HttpClient class
            var client = new HttpClient();

            //Encode Content
            var req = new HttpRequestMessage(HttpMethod.Post, server) { Content = new FormUrlEncodedContent(values) };

            //POST request
            var res = await client.SendAsync(req);

            //Get response value
            var responseString = await res.Content.ReadAsStringAsync();

            return responseString;

        }
        catch (Exception e)
        {
            System.IO.File.AppendAllText(@"c:\inetpub\wwwroot\WebApplication\TrustedAuthError.txt", ":::ERROR::: " + System.DateTime.Today.ToString() + ":::" + e.ToString() + Environment.NewLine);
            //Add Log4Net logging
        }

        return "-1";

    }

    public string addTicket(string ticket, string reportLink)
    {
        //Add ticket parameter with ticket value. I'm using </object> as my keyword to find and replace
        string addedTicket = reportLink.Replace("</object>", "<param name='ticket' value='" + ticket + "' /></object>");

        return addedTicket;
    }
}

Контроллер приборной панели

public async Task<ActionResult> Dashboard(int Report_Num)
    {

        var ticket = "";
        //Get Trusted Tableau Authentication Ticket
        try
        {
            ticket = await _trustedAuth.requestTicket(b.getSSO(User.Identity.Name), ConfigurationManager.AppSettings["TrustedAuthTableauServer"], ConfigurationManager.AppSettings["TrustedAuthSiteName"]);
        }
        catch
        {
            ticket = "-1";
        }

        //Only add trusted Tableau Authentication ticket if it valid, else kick user to default Report_Link which will make them login manually. 
        //You get a nasty error message if you pass in a '-1'
        if (!ticket.Equals("-1"))
        {
            ViewBag.Link = _trustedAuth.addTicket(ticket.ToString(), report_Completion_Status.Report_Link);
        }
        else
        {
            ViewBag.Link = report_Completion_Status.Report_Link;
        }

        var model = await this.GetFullAndPartialViewModel(Report_Num);

        return this.View(model);
    }

Новый встроенный JavaScript (reportLink) со вставленным параметром заявки

Изображение 174551

Панель инструментов View

@model WebReportingToolDAL.Models.ViewModels.ReportCategoryListModel
@{
    ViewBag.Title = "Dashboard";
    Layout = "~/Views/Shared/_Layout.cshtml";
}

 <body>
    @Html.Raw(ViewBag.Link)
</body>

Если все работает, вы больше не должны видеть страницу входа в Tableau.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню