代码之家  ›  专栏  ›  技术社区  ›  DaniDev

使用匿名身份验证进行本地访问以保护旧式Web服务网站

  •  1
  • DaniDev  · 技术社区  · 7 年前

    网络表单 使用驻留在同一服务器上的(ASP.net)Web服务(使用匿名访问)的应用程序 服务器(同一个域,不同的应用程序,每个应用程序都有自己的专用应用程序池)。此应用程序托管在安全的 但现在有一个托管请求 公开

    在不进行大量重新编码(在应用程序级别)的情况下,保护web服务站点的权宜(但安全)方法是什么。我已尝试在中配置Web服务网站 IIS 服务帐户 (标识),在该标识下,Web应用程序应用程序池运行,但来自应用程序的当前请求模式始终使用 匿名访问 . 我需要限制访问,只允许这个特定的web应用程序。我在想一个 ISAPI 过滤器,但不建议用于 + ?

    附录: 网络服务

    2 回复  |  直到 6 年前
        1
  •  2
  •   Daniel Botero Correa    7 年前

    我建议您使用IdentityServer和OpenIdConnect来实现这一点。

    IdentityServer是一个。基于NET/Katana的框架和可承载组件 这使得现代网络能够实现单点登录和访问控制 桌面应用程序,并可扩展以允许在新的和 现有架构。

    基于授权服务器执行的身份验证,如 以及获取有关最终用户的基本配置文件信息 https://connect2id.com/learn/openid-connect

    使用此选项,您可以要求identity server为您提供访问令牌和Id令牌。

    身份令牌表示身份验证过程的结果。 它至少包含一个用户标识符(称为 用户和有关用户如何在OP上进行身份验证的详细信息。

    令牌并将其转发到API。访问令牌包含信息 关于客户端和用户(如果存在)。API使用该信息 授权访问他们的数据。

    在您的示例中,您可以在您的Webforms应用程序和WebService之间实现客户端凭据流。(在这个流程中,你不会对WebForms应用程序的用户不问任何问题)。因此,这个想法是WebForms应用程序将要求identity server为其提供访问令牌,以访问webservices资源。在WebService中,您必须基于您想要的任何内容(范围、声明等)实现授权。请阅读LeastPrivilege博客(DominickBaier),他和他的好友BrockAllen是这些话题的大师。因为我不能在StackOverflow中发布超过1个链接,这真的很糟糕,所以你必须用谷歌搜索它们或任何其他信息。

    如果需要用户身份验证,可以使用隐式流、代码流或混合流。但这取决于你真正想做什么。

    我认为您可能需要编写一些代码,但并不太多。您可以找到一种在到达任何端点之前请求授权的方法。

    我希望我是清楚的。如果没有,请询问我更多的解释。

        2
  •  1
  •   DaniDev    6 年前

    http Module 解决方案,因为它具有以下优点:

    最小编码

    ASP.Net 安全模型(本地访问)

    (VS:DLL项目)

    using System;
    using System.Web;
    using System.Threading;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    
    namespace FilterModule
    {
        class AuthorizeLocal : IHttpModule
        {
            public void Init(HttpApplication app)
            {
                app.BeginRequest += new EventHandler(OnBeginRequest);
            }
    
    
            private void OnBeginRequest(Object s, EventArgs e)
            {
                HttpApplication app = s as HttpApplication;
                HttpRequest req = app.Request;
                HttpContext context = app.Context;
    
                if (!req.IsLocal)    // Is the request from a Local Source?
                {
                    context.Response.Close(); // close the response: ends request
                }
    
                /* Optional Test Code - to view locally create an html page TestModule.html in target site */
                string Identity = Thread.CurrentPrincipal.Identity.Name;
                string filePath = context.Request.FilePath;
                string fileExtension = VirtualPathUtility.GetExtension(filePath);
                string fileName = VirtualPathUtility.GetFileName(filePath);
    
                if (fileName.ToLower().Equals("testmodule.html"))
                {
                    try
                    {
                        app.Context.Response.Write("app: " + app.ToString());
                        context.Response.Write("<br/>server: " + app.Server.ToString());
                        context.Response.Write("<br/>Thread.CurrentPrincipal.Identity.Name: " + Thread.CurrentPrincipal.Identity.Name);
                        context.Response.Write("<br/>HttpRequest: " + req.Url.ToString());
                        context.Response.Write("<br/>req.UserHostName: " + req.UserHostName);
                        context.Response.Write("<br/>req.UserHostAddress: " + req.UserHostAddress);
                        context.Response.Write("<br/>filePath: " + filePath);
                        context.Response.Write("<br/>fileName: " + fileName);
                        context.Response.Write("<br/>fileExtension: " + fileExtension);
                        context.Response.Write("<br/>req.IsLocal: " + req.IsLocal.ToString());
                        context.Response.Write("<br/>req.LogonUserIdentity: " + req.LogonUserIdentity);
                        context.Response.Write("<br/>req.UserHostName : " + req.UserHostName);
                        context.Response.Write("<br/>req.AnonymousID " + req.AnonymousID);
                        context.Response.Write("<br/>req.IsAuthenticated : " + req.IsAuthenticated);
                    }
                    catch (Exception Ex)
                    {
                        context.Response.Write("<br/> " + Ex.ToString());
                    }
                }
    
                //if (_eventHandler != null)
                //    _eventHandler(this, null);
            }
    
            public void Dispose()
            {
    
            }
    
        }
    }
    

    实施

    1. FilterModule.dll )到Web服务(站点) bin 目录

    <system.webServer> 下的部分 <modules>
    添加以下内容:

    <add name ="FilterModule" type="FilterModule.AuthorizeLocal" />