Tag: katana

从OWIN Middleware更改响应对象

我的OWIN中间件就是这样的。 (Framework是ASP.NET Web API)。 public class MyMiddleware : OwinMiddleware { public MyMiddleware(OwinMiddleware next) : base(next) { } public override async Task Invoke(OwinRequest request, OwinResponse response) { var header = request.GetHeader(“X-Whatever-Header”); await Next.Invoke(request, response); response.SetHeader(“X-MyResponse-Header”, “Some Value”); response.StatusCode = 403; } } 问题: 是从OwinMiddleware派生的推荐做法吗? 我看到在Katana源代码中,一些中间件类派生自OwinMiddleware而OwinMiddleware一些则不是。 我可以看到请求标头没问题。 Next.Invoke在我的中间件之后设置响应头或状态代码对返回给客户端的响应没有影响。 但是,如果我在Next.Invoke调用之前设置响应标头或状态,则带有标头的响应和我设置的状态将返回给客户端。 设置这些的正确方法是什么?

替代在System.Web中为Owin使用HttpContext

ASP.NET身份validation现在基于OWIN中间件,可以在任何基于OWIN的主机上使用。 ASP.NET Identity 对System.Web没有任何依赖 。 我有一个AuthorizeAttributefilter,我需要获取当前用户并添加一些属性以供操作控制器稍后检索。 问题是我必须使用属于System.Web的HttpContext。 对于Owin有没有HttpContext的替代方案? public class WebApiAuthorizeAttribute : AuthorizeAttribute { public override async Task OnAuthorizationAsync(HttpActionContext actionContext, CancellationToken cancellationToken) { base.OnAuthorization(actionContext); Guid userId = new Guid(HttpContext.Current.User.Identity.GetUserId()); ApplicationUserManager manager = new ApplicationUserManager(new ApplicationUserStore(new ApplicationDbContext())) { PasswordHasher = new CustomPasswordHasher() }; ApplicationUser user = await manager.FindByIdAsync(userId); actionContext.Request.Properties.Add(“userId”, user.LegacyUserId); } } 注意:我发现这个问题 ,似乎是重复的,但要求为NancyFx项目工作的解决方案,这对我来说无效。

用户(IPrincipal)在ApiController的构造函数上不可用,使用Web Api 2.1和Owin

我正在使用带有Asp.Net Identity 2的Web Api 2.1。我试图在我的ApiController的构造函数上获取经过身份validation的用户(我使用AutoFac来注入我的依赖项),但是当调用构造函数时,User显示为未经过身份validation。 我正在尝试获取用户,以便我可以为任何数据库写操作生成审核信息。 我正在做的一些事情可以帮助诊断: 我只使用app.UseOAuthBearerTokens作为Asp.Net Identity 2的身份validation。这意味着我删除了在使用Asp.Net创建新的Web Api 2.1项目时默认启用的app.UseCookieAuthentication(new CookieAuthenticationOptions())身份2。 在WebApiConfig里面我正在注入我的存储库: builder.RegisterType().As().InstancePerRequest(); 这是我的控制器: [RoutePrefix(“api/values”)] public class ValuesController : ApiController { private IValueRepository valueRepository; public ValuesController(IValueRepository repo) { valueRepository = repo; // I would need the User information here to pass it to my repository // something like this: valueRepository.SetUser(User); } protected override […]

如何安全地拦截自定义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 = […]