DataZen如何使用header认证?

How to use header authentication with DataZen?

我们正在使用 DataZen 通过仪表板可视化一些数据。

我们想使用 header 身份验证,但文档没有提供任何信息 header 字段要用 external_auth_key.

设置

有人知道在使用 DataZen 的 header 身份验证时要设置哪些 header 字段吗?

快速前言:确实不应该使用此功能。它没有很好的记录,因为它几乎从来都不是设置服务器的正确方法。您应该始终认真考虑替代方案,例如默认模式(Datazen 为您处理凭据)或 better-yet、Active Directory 联合身份验证服务。

外部身份验证是一种相对不安全的方法,因为所有信任都放在代理上。除非您绝对需要它并且您没有使用 Active Directory,否则通常应该避免使用它。


您必须告诉 Datazen 要查找哪个 header 或 cookie。您可以通过控制面板 UI.

请注意 "Authentication key" 设置为 case-sensitive,因此我通常建议坚持全部小写。

设置好设置后,只需转到您的代理(以您选择实现的任何形式)并使用该名称设置 header 和 1:1 Datazen 用户名应该进行身份验证。

例如,如果我使用上述设置登录代理,代理应发出以下请求:

GET /viewer HTTP/1.1
thisistheheadername: v-mhauge
...

读取该 header 后,Datazen 服务器将像该用户已登录一样响应。

免责声明:我是 Microsoft 的支持工程师,付费支持 Datazen。

更改服务配置:

<add key="authtype" value="external" />
<add key="external_auth_type" value="header" />
<add key="external_auth_key" value="zabr" />

重新启动服务。 在 datazen 中创建用户:zabr。 授予用户权限:zabr.

已更改 nginx:

            location / {
                    proxy_pass http://tfs10.domain.ru:81/;
                    proxy_set_header zabr 'zabr';
            }

结果 ==> 成功了!

我可以通过 fiddler 传递 header 信息,它似乎可以工作,但我终究无法弄清楚如何通过 asp 网络应用程序传递它与 iframe 中的引用站点。我已经创建了这个 class,但是 header 只是以某种方式丢失了它。

Public Class CustomHttpModule
    Implements IHttpModule

    Public Sub New()
        ' Class constructor.
    End Sub


    ' Classes that inherit IHttpModule 
    ' must implement the Init and Dispose methods.
    Public Sub Init(ByVal app As HttpApplication) Implements IHttpModule.Init
        AddHandler app.BeginRequest, AddressOf app_BeginRequest
    End Sub


    Public Sub Dispose() Implements IHttpModule.Dispose
        ' Add code to clean up the
        ' instance variables of a module.
    End Sub

    Public Sub app_BeginRequest(ByVal o As Object, ByVal ea As EventArgs)
        Dim user As New ArrayList
        Dim headers As NameValueCollection = HttpContext.Current.Request.Headers
        Dim t As Type = headers.GetType()
        t.InvokeMember("MakeReadWrite", System.Reflection.BindingFlags.InvokeMethod Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance, Nothing, headers, Nothing)
        t.InvokeMember("InvalidateCachedArrays", System.Reflection.BindingFlags.InvokeMethod Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance, Nothing, headers, Nothing)
        user.Add("username")
        t.InvokeMember("BaseAdd", System.Reflection.BindingFlags.InvokeMethod Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance, Nothing, headers, New Object() {"headerkey", user})
        t.InvokeMember("MakeReadOnly", System.Reflection.BindingFlags.InvokeMethod Or System.Reflection.BindingFlags.NonPublic Or System.Reflection.BindingFlags.Instance, Nothing, headers, Nothing)
    End Sub

End Class

我也能够通过 asp 成功完成 web-request,但是我无法使用 iframe 完成它..