我继承了一个使用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标记,链接到其他测试页面
一个想法是添加一个MVC LoginController和AdAuthenticationService管理cookies模型来管理登录,该登录是作为ConfigAuth(app)行中提到的Startup的一部分配置的,但中间件忽略了控制器。 MVC适合吗?
然后,我正在查看此ServerMiddleware并尝试了解如何使用ActiveDirectory身份验证拦截默认页面浏览器调用。
我知道我可能会忽视某些事情。非常感谢您提供的任何建议或资源,以帮助我解决这个困惑。
答案 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也可以保持自己的身份验证。