如何将基本身份验证质询转发到报告管理器 url

Posted

技术标签:

【中文标题】如何将基本身份验证质询转发到报告管理器 url【英文标题】:how to forward basic authentication challenge to report manager url 【发布时间】:2012-06-25 16:34:08 【问题描述】:

*环境的细节在底部描述。

我正在尝试为报告服务构建身份验证解决方案。

应使用我们现有的客户数据库对在线客户进行身份验证,而本地管理用户可以使用简单的基本身份验证。

我使用 codeplex 示例对s-s-rS 进行了安全扩展,我用来发出基本挑战的方式如下

public void GetUserInfo(out IIdentity userIdentity, out IntPtr userId)

    if (HttpContext.Current != null && HttpContext.Current.User != null)
        userIdentity = HttpContext.Current.User.Identity;
    else
    
        HttpContext.Current.Response
            .AddHeader("WWW-Authenticate", "Basic realm=\"ReportServer\"");
        HttpContext.Current.Response.Status = "401 Unauthorized";
        HttpContext.Current.Response.Flush();
        HttpContext.Current.Response.Close();
        userIdentity = new GenericIdentity("not authorized");
    

    userId = IntPtr.Zero;

这样,当未通过 LogonUser 方法的用户(即直接 url 访问、投标报告部署,而不是常规用户应用程序)受到基本登录/密码弹出窗口的挑战时。为了支持这一点,我制作了一个 httpmodule 如下

void IHttpModule.Init(HttpApplication context)

    context.AuthenticateRequest += CustomAuthenticateRequest;


void CustomAuthenticateRequest(object sender, EventArgs e)

    var app = sender as HttpApplication;

    if (app == null) return;

    var basicAuth = app.Context.Request.Headers["Authorization"];

    if (!string.IsNullOrEmpty(basicAuth))
    
        var loginpass = Encoding.Default.GetString(
           Convert.FromBase64String(basicAuth.Replace("Basic ", ""))).Split(':');
        if (loginpass.Length == 2 
            && loginpass[0] == adminUser 
            && loginpass[1] == adminPass)
        
            app.Context.User = new GenericPrincipal(
                new GenericIdentity(adminUser), null);
        
    

这在访问/ReportServer URL 时工作正常,我受到挑战,输入硬编码的管理员登录名/密码并登录。

问题是访问/Reports时我得到了

System.Net.WebException:请求失败,HTTP 状态为 401: 未经授权

我想知道如何将登录/通过挑战一直传递到/Reports

我正在运行 SqlServer 2012 和 Reporting Services 2012,但内部工作与 s-s-rS 2008-R2 相比没有改变

在我的web.config 我有

<authentication mode="None" />
<identity impersonate="false" />, and the entry for the httpmodule

rs-s-rvpolicy.config 上,我的 httpmodule 的代码组使用 FullTrust

rsreportserver.config我有

    <AuthenticationTypes>
        <Custom/>
    </AuthenticationTypes>, and the entry for the security extension

我还没有配置SSL,绑定是默认的

【问题讨论】:

我仍然希望得到答案,但现在我已经做了一个解决方法。在我的 HttpModule 上,我只允许通过本地机器访问来访问报表管理器。从本地机器访问时,我只是将上下文用户设置为管理员。一个非常丑陋的解决方案,但仍然是一个解决方案。 ReportManager 使用相同的公共 SOAP API 与 ReportServer 对话,因此它必须以某种方式对自己进行身份验证。我猜您需要将相同的模块添加到 ReportManager 配置文件中。我希望 ReportManager 然后将使用相同的身份验证 cookie 或凭据与 ReportServer 对话。 自定义安全是可能的。如果您在 s-s-rS 服务级别覆盖 Authenticate 和 Authorize 方法,那么只需在 s-s-rs 管理器中包含这些功能并提供默认登录页面。 您可能需要另一个用于报告的 SSIS 安全扩展?您有Basic realm=\"ReportServer\"",但是当您访问不同的“领域”时会发生什么 - 没有常规身份验证,也没有基本身份验证请求... 【参考方案1】:

从错误信息来看,似乎是在呈现报表管理器的 UI 时发生了身份验证错误。请转到文件夹 c:\Program Files\Microsoft SQL Server\MSRS11.MSSQLSERVER\Reporting Services\ReportManager\,找到 web.config 文件,并应用以下更改。

<authentication mode="None" />
<identity impersonate="false" />, and the entry for the httpmodule

【讨论】:

以上是关于如何将基本身份验证质询转发到报告管理器 url的主要内容,如果未能解决你的问题,请参考以下文章

如何在 UIWebView 中显示身份验证质询?

如何使用 WKWebView 正确实施身份验证质询?

在 ReactJS 中的 Spotify API 上为 PKCE 身份验证创建代码验证器和质询

Python Cassandra:未发送身份验证质询,这是可疑的,因为驱动程序需要身份验证

在 AWS Cognito 中回答 NEW_PASSWORD_REQUIRED 质询后继续使用自定义身份验证流程

如何根据授权服务器的传入 URL 配置多个身份验证管理器?