Tag: owin middleware

C#:修改Owin响应流会导致AccessViolationException

我试图在特定情况下使用一些自定义Owin中间件来修改(在这种情况下,完全替换)响应流。 每当我打电话确实触发我的中间件来替换响应时,一切正常。 只有当我打电话给我的中间件没有进行更改时,才会出现此问题。 此外,我只能在未被替换的API调用返回手动创建的HttpResponseMessage对象时发生错误。 例如,调用此API: public class testController : ApiController { public HttpResponseMessage Get() { return Request.CreateResponse(HttpStatusCode.OK,new { message = “It worked.” }); } } 工作正常,但这个类: public class testController : ApiController { public HttpResponseMessage Get() { HttpResponseMessage m = Request.CreateResponse(); m.StatusCode = HttpStatusCode.OK; m.Content = new StringContent(“It worked.”, System.Text.Encoding.UTF8, “text/plain”); return m; } } 导致错误发生。 […]

为什么在HttpRequest结束后第二次创建了owin中间件

根据为什么来自Asp.Net Identity的ApplicationDbContext被创建并按照请求处理两次的问题后,我做了一些研究,为什么会发生这种情况。 我发现每个HttpRequest创建一次ApplicationDbContext但是当使用Owin管道时,将在HttpRequest结束后第二次创建Owin Middleware。 因此,当用户单击一个链接时,确实会第二次创建ApplicationDbContext从而给出每个WebRequest创建对象两次的印象。 经过大量的研究,我决定在不使用任何身份validation的情况下启动一个简单的MVC 5项目。 从NuGet添加Owin中间件后,我创建了以下Owin Middleware组件。 这基本上检查HttpContext字典中是否存在一些假对象,如果不存在则创建一个伪对象。 输出将写入调试窗口以使事情变得简单。 [assembly: OwinStartupAttribute(typeof(MvcPlain.Startup))] namespace MvcPlain { public class Startup { public static int Counter; public static string FakeKeyName; public void Configuration(IAppBuilder app) { app.Use(async (context, next) => { Debug.WriteLine(“Owin middleware entered => begin request”); FakeKeyName = “owinKey” + Counter.ToString(); var fakeKeyPresent = HttpContext.Current.Items.Contains(FakeKeyName); Debug.WriteLine(string.Format(“{0} key […]

为什么auth中间件声明的顺序在Owin Startup类中很重要?

我读了一些关于在使用web api时在owin管道中设置身份validation的示例( 1,2,3,4) ,并且示例将身份validation中间件声明为Configuration方法中的第一个中间件,但没有告诉它为什么需要第一。 在这个问题中,作者在认证中间件之前附加了webapi中间件,然后认证无法正常工作。 当auther将它移动到方法的顶部时,一切都按预期工作。 有谁知道为什么需要将身份validation中间件添加为启动配置方法中的第一个中间件?

创建为.Net Auth Cookie交换自定义令牌的Owin Auth Provider

我正在尝试在2 .Net应用程序之间创建类似SSO的解决方案.Net app 1有一个自定义令牌生成器和端点来validation返回用户信息的令牌。 .Net应用程序2使用Owin进行保护,是一个典型的独立应用程序,用户可以使用密码和用户名直接登录。 我创建(基于Passion for Coding Blog和Github )一个自定义Owin提供程序,它可以在Authorization标头中查找标记,也可以从用户从.Net App 1单击链接并发送到的链接中查找参数.Net App 2查询字符串中的令牌与GET一样(我知道这不安全,我们最终将使用OpenID来获取它的价值,我们只需要这个演示)。 我能够获得令牌validation它并创建一个身份并进行身份validation我不能让提供者创建一个.Net Auth Cookie,以便后续请求得到身份validation而不会出现401错误。 处理程序文件: using Microsoft.Owin.Infrastructure; using Microsoft.Owin.Logging; using Microsoft.Owin.Security; using Microsoft.Owin.Security.Infrastructure; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Security.Claims; using System.Text; using System.Threading.Tasks; namespace SomeOAuth { // Created by the […]

我是否应该使用OwinContext的环境来保存每个请求的特定于应用程序的数据

我需要一种方法来存储每个请求的日志对象。 使用HttpContext,我会将其添加到项目Dictionary中。 如果我能帮助它,我不想把HttpContext带进去。 下面的代码是我建议的Unity LifeTimeManager,它将在OwinContext的Environment属性中存储对象,我可以使用我的Owin中间件访问它。 public class OwinContextLifetimeManager : LifetimeManager { private string key = (new Guid()).ToString(); private IDictionary environment; public OwinContextLifetimeManager(IDictionary environment) { this.environment = environment; } public override object GetValue() { if (environment != null && environment.ContainsKey(key)) return environment[key]; else return null; } public override void RemoveValue() { if (environment != null) environment.Remove(key); […]

如何使用Owin中间件拦截404

背景 首先让我解释一下背景。 我正在研究一个项目,该项目试图将使用通过IIS上托管的OWIN配置的Web API的后端服务器结合起来,但未来可能还有其他OWIN支持的主机 – 使用AngularJS的前端。 AngularJS前端完全是静态内容。 我完全避免服务器端技术,如MVC / Razor,WebForms,Bundles,任何与前端及其使用的资产有关的技术,而是推迟使用Node.js,Grunt / Gulp等最新最好的技术。处理CSS编译,捆绑,缩小等等。由于我不会进入这里的原因,我将前端和服务器项目保存在同一项目中的不同位置(而不是直接将它们全部放在Host项目中(参见raw下图)。 MyProject.sln server MyProject.Host MyProject.Host.csproj Startup.cs (etc.) frontend MyProjectApp app.js index.html MyProjectApp.njproj (etc.) 所以就前端而言,我需要做的就是让我的主机服务我的静态内容。 在Express.js中,这是微不足道的。 使用OWIN,我能够使用Microsoft.Owin.StaticFiles中间件轻松地完成此操作,并且它运行良好(非常灵活)。 这是我的OwinStartup配置: string dir = AppDomain.CurrentDomain.RelativeSearchPath; // get executing path string contentPath = Path.GetFullPath(Path.Combine(dir, @”../../../frontend/MyProjectApp”)); // resolve nearby frontend project directory app.UseFileServer(new FileServerOptions { EnableDefaultFiles = true, FileSystem = […]

如何安全地拦截自定义Owin中间件中的响应流

我正在尝试编写一个简单的OWIN中间件,以拦截响应流。 我想要做的是用自定义的基于Stream的类替换原始流,在那里我将能够拦截对响应流的写入。 但是,我遇到了一些问题,因为我无法知道响应是否已被链中的内部中间件组件完全写入。 永远不会调用Stream的Dispose重写。 所以我不知道什么时候执行我的处理,这应该发生在响应流的末尾。 这是一个示例代码: public sealed class CustomMiddleware: OwinMiddleware { public CustomMiddleware(OwinMiddleware next) : base(next) { } public override async Task Invoke(IOwinContext context) { var request = context.Request; var response = context.Response; // capture response stream var vr = new MemoryStream(); var responseStream = new ResponseStream(vr, response.Body); response.OnSendingHeaders(state => { var resp = […]