将AD身份验证添加到OWIN Server Middleware管道

时间:2017-04-26 13:24:23

标签: asp.net authentication owin

我继承了一个使用OWIN开发的项目,服务器中间件管理一种WebApi,以便使用ApiKeys与移动设备进行通信。服务器端有一个小的Web界面(实际上是一组测试页面),但没有添加身份验证。我试图围绕正在使用的不同框架以及围绕这些OWIN技术进行身份验证的方式。

让我先说明一下:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        log.Info("RT Server app starting up ...");
        // Initialize the ApiKey Needed for ApiClient Library
        ApiClient.ApiKey = Globals.ApiKey;
        // Initialize the Services Library
        Services.Startup.Initialize();//creates a configuration map of values for devices
        // Setup Server Middleware
        app.Use(typeof(ServerMiddleware), "RTrak.Server", "RTrak.Server");
        app.Use(typeof(ServerMiddleware), "RTrak.Server.Pages", "RTrak.Server");
         // HttpListener listener =   (HttpListener)app.Properties["System.Net.HttpListener"];//throws an KeyNotFoundException
         // listener.AuthenticationSchemes = AuthenticationSchemes.IntegratedWindowsAuthentication;
        //ConfigureAuth(app)
    }

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = MyAuthentication.ApplicationCookie,
            LoginPath = new PathString("/Login"),
            Provider = new CookieAuthenticationProvider(),
            CookieName = "RTrakCookie",
            CookieHttpOnly = true,
            ExpireTimeSpan = TimeSpan.FromHours(12), // ...
        });
    }

ServerMiddleware

   public ServerMiddleware(OwinMiddleware next, string baseNamespace, string defaultClass) : base(next)
    {
        BaseNamespace = baseNamespace;
        DefaultClass = defaultClass;
    }

    public override async Task Invoke(IOwinContext owinContext)
    {
        var absolutePath = owinContext.Request.Uri.AbsolutePath;
        string serverNamespace = BaseNamespace;

        Type type;
        string classToLoad = "";

        if (absolutePath == "/")
            classToLoad = DefaultClass;
        else
        {
            classToLoad = absolutePath.Substring(1).Replace('/', '.');
            if (classToLoad.EndsWith("."))
                classToLoad = classToLoad.Substring(0, classToLoad.Length - 1);
        }
        type = Type.GetType($"{serverNamespace}.{classToLoad}, {serverNamespace}", false, true);

        if (type == null)
        {
            classToLoad += ".Default";
            type = Type.GetType($"{serverNamespace}.{classToLoad}, {serverNamespace}", false, true);
        }

        if (type != null)
        {
            try
            {
                object objService = Activator.CreateInstance(type);
                ((Resource)objService).Execute(owinContext);
            }
            catch (System.MissingMethodException)
            {
                //"403 INVALID URL");
            }
        }
        else
            await Next.Invoke(owinContext);
    }
}

ServerMiddleware首先调用默认页面类,该类是HTML标记,链接到其他测试页面

enter image description here

一个想法是添加一个MVC LoginController和AdAuthenticationService管理cookies模型来管理登录,该登录是作为ConfigAuth(app)行中提到的Startup的一部分配置的,但中间件忽略了控制器。 MVC适合吗?

然后,我正在查看此ServerMiddleware并尝试了解如何使用ActiveDirectory身份验证拦截默认页面浏览器调用。

我知道我可能会忽视某些事情。非常感谢您提供的任何建议或资源,以帮助我解决这个困惑。

1 个答案:

答案 0 :(得分:0)

我解决这个问题的方法是单独留下OWIN Middleware对象,除了Startup.cs必须定义CookieAuthentication路径

        app.UseCookieAuthentication(new Microsoft.Owin.Security.Cookies.CookieAuthenticationOptions
        {
            AuthenticationType = "ApplicationCookie",
            LoginPath = new Microsoft.Owin.PathString("/Auth/Login")
        });

      app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);

用于构建为OWIN Resources的页面。这些OWIN资源"页面"然后检查

                if (!this.Context.Authentication.User.Identity.IsAuthenticated)

然后我实现了一个MVC控制器,它使用上面的AdAuthenticationService和UserManager来管理AD凭证和身份,其中OWIN资源重定向到MVC视图+控制器以进行身份​​验证。该控制器处理登录页面操作。经过身份验证后,MVC会重定向到OWIN资源页面。

因此,只要OWIN不尝试定义MVC想要使用的路由,OWIN Middleware和MVC就可以并存。 Owin也可以保持自己的身份验证。