Ссылка на Tableau's Как работает доверенная аутентификация
Обзор высокого уровня о том, как я внедрил Trusted Authentication
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's 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) со вставленным параметром заявки
Вид панели инструментов
@model WebReportingToolDAL.Models.ViewModels.ReportCategoryListModel
@{
ViewBag.Title = "Dashboard";
Layout = "~/Views/Shared/_Layout.cshtml";
}
<body>
@Html.Raw(ViewBag.Link)
</body>
Если все работает, вы больше не должны видеть страницу входа в Tableau.