- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
对于基本身份验证,我已经实现了自定义 HttpMessageHandler
基于 Darin Dimitrov 的答案中显示的示例:https://stackoverflow.com/a/11536349/270591
代码创建一个实例principal
类型 GenericPrincipal
包含用户名和角色,然后将此主体设置为线程的当前主体:
Thread.CurrentPrincipal = principal;
稍后在 ApiController
方法主体可以通过访问 Controller User
来读取属性:
public class ValuesController : ApiController
{
public void Post(TestModel model)
{
var user = User; // this should be the principal set in the handler
//...
}
}
这似乎工作正常,直到我最近添加了一个自定义 MediaTypeFormatter
使用Task
像这样的库:
public override Task<object> ReadFromStreamAsync(Type type, Stream readStream,
HttpContent content, IFormatterLogger formatterLogger)
{
var task = Task.Factory.StartNew(() =>
{
// some formatting happens and finally a TestModel is returned,
// simulated here by just an empty model
return (object)new TestModel();
});
return task;
}
(我有这种方法从一些示例代码中使用 Task.Factory.StartNew
in ReadFromStreamAsync
启动任务。这是错误的,也许是问题的唯一原因?)
现在,“有时” - 对我来说它似乎是随机的 - User
Controller 方法中的主体不再是我在 MessageHandler 中设置的主体,即用户名 Authenticated
旗帜和角色全部丢失。原因似乎是自定义 MediaTypeFormatter 导致 MessageHandler 和 Controller 方法之间的线程发生变化。我通过比较 Thread.CurrentThread.ManagedThreadId
的值证实了这一点在 MessageHandler 和 Controller 方法中。 “有时”它们是不同的,然后校长就“迷失”了。
我现在正在寻找设置 Thread.CurrentPrincipal
的替代方案以某种方式将主体安全地从自定义 MessageHandler 传输到 Controller 方法并在 this blog post 中使用请求属性:
request.Properties.Add(HttpPropertyKeys.UserPrincipalKey,
new GenericPrincipal(identity, new string[0]));
我想测试一下,但似乎HttpPropertyKeys
类(位于命名空间 System.Web.Http.Hosting
中)没有 UserPrincipalKey
最近的 WebApi 版本(候选版本和上周的最终版本)中不再包含此属性。
我的问题是:如何更改上面的最后一个代码片段,以便它适用于当前的 WebAPI 版本?或者一般来说:如何在自定义 MessageHandler 中设置用户主体并在 Controller 方法中可靠地访问它?
编辑
提到here “HttpPropertyKeys.UserPrincipalKey
... 解析为 “MS_UserPrincipal”
”,所以我尝试使用:
request.Properties.Add("MS_UserPrincipal",
new GenericPrincipal(identity, new string[0]));
但它并没有像我预期的那样工作:ApiController.User
属性不包含添加到 Properties
的主体以上集合。
最佳答案
这里提到了在新线程上丢失主体的问题:
http://leastprivilege.com/2012/06/25/important-setting-the-client-principal-in-asp-net-web-api/
Important: Setting the Client Principal in ASP.NET Web API
Due to some unfortunate mechanisms buried deep in ASP.NET, setting Thread.CurrentPrincipal in Web API web hosting is not enough.
When hosting in ASP.NET, Thread.CurrentPrincipal might get overridden with HttpContext.Current.User when creating new threads. This means you have to set the principal on both the thread and the HTTP context.
这里:http://aspnetwebstack.codeplex.com/workitem/264
Today, you will need to set both of the following for user principal if you use a custom message handler to perform authentication in the web hosted scenario.
IPrincipal principal = new GenericPrincipal(
new GenericIdentity("myuser"), new string[] { "myrole" });
Thread.CurrentPrincipal = principal;
HttpContext.Current.User = principal;
我已将最后一行 HttpContext.Current.User =principal
(需要 using System.Web;
)添加到消息处理程序和 User
ApiController
中的 code> 属性现在始终具有正确的主体,即使线程由于 MediaTypeFormatter 中的任务而发生更改也是如此。
编辑
强调一下:仅当 WebApi 托管在 ASP.NET/IIS 中时,才需要设置 HttpContext
当前用户的主体。对于自托管来说,没有必要(也不可能,因为 HttpContext
是一个 ASP.NET 构造,并且在自托管时不存在)。
关于asp.net - 如何在自定义 WebAPI HttpMessageHandler 中安全地设置用户主体?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12028604/
我试图将护照逻辑放入 Controller 文件中,但问题是当我将逻辑放入 Controller 中时,它告诉我“无法读取未定义的属性“主体””,但是当我将代码移至索引时,所有内容都会路由向右走 in
我正在学习 Javascript,我正在尝试创建一个简单的下拉菜单。我想要的功能的一个例子可以在谷歌主页的顶部菜单中看到,带有“更多”和“设置”下拉菜单。具体来说,当您单击关闭菜单时,菜单会消失。 我
我正在努力让 Swagger 正确呈现我的 ServiceStack 服务。 我希望看到一个 UserId 字符串作为表单参数,一个 PrivateCustomer 对象作为主体参数,但是尽管 Use
注意:由于随后的研究,这个问题已经完全重组。 我正在尝试从 Shiro 的主题 PrincipalCollection 中检索值.我在集合中添加了两个主体。 Username和 UUID .当我试图记
我们正在开发一个将 OAuth 2 用于两个用例的应用程序: 访问后端微服务(使用 client_credentials) 验证应用程序的用户(使用 authorization_code ,因此将用户
我有这段代码生成一个将 myNumber 乘以 5 的委托(delegate) ParameterExpression numParam = Expression.Parameter(typeof(i
我有一些jquery, $( document ).ready(function() { body=$(body).html; $("html").html(body); }); 这应
我创建了一个通用异常 DTO,它也扩展了 RuntimeException。通过这种方式,可以在应用程序中使用它,也可以将其用作 DTO。问题是当我将 DTO 应用于 ResponseEntity 构
在 Angular 5 HttpClient 中,我可以通过这种方式设置 HttpParams()。 const body = new HttpParams() .set('email', '
我正在从 RabbitMQ 读取数据,如下所示: connection = factory.newConnection(); ch = connection.createChannel() ; Str
如何使用不同类型的调用和响应主体来改造 PUT?我有一个错误限制。类型必须相同 and 。响应bodie可以包含int值,但call不应该,因为当我用int值初始化CallBody对象时,它已经包
原则上我想做这样的事情: #grab some value from outer source (i.e. file or list defined by another programer) set
我知道如何使用TextureRegions 创建动画并将其应用于非box2d 游戏中的对象。 但是在 libgdx 的 box2d 中,我不知道该怎么做。在CocosD2中,Sprite对象中有run
我有这段代码生成一个将 myNumber 乘以 5 的委托(delegate) ParameterExpression numParam = Expression.Parameter(typeof(i
我已经计算了花括号的数量,但无法弄清楚为什么类主体不完整。每次我试图修复类(class)时,都会把整个类(class)弄乱。问题出在代码中的最后一个类。最后一个花括号给我带来了类里面的麻烦。我正在使用
有人知道吗?我只能看到 ApplyTorque 和 SetAngularVelocity,我只想在将对象添加到模拟之前旋转对象,例如:所以我有一个 crate 倾斜靠在墙上,另一个 crate 是平的
我可以获得如何让图像出现在 box2d 主体上的简单答案吗?我尝试为图像和主体创建 x 和 y int,但是一旦主体移动,图像就会保持静态。如果您确实回答,请尽可能解释一下代码。如果您对我的完整源代码
我知道我可以通过使用 PolygonRegion 来做到这一点,但问题是我使用 scene2d.Stage 和几个 Actor 。您可能知道阶段使用 SpriteBatch 而我无法渲染 Polygo
您好,我有以下代码: function redirect(){ window.location.href='logged_out_chat.php'; } ...在我的标题和以下正文标记中:
我在 didBegin(contact:) 中触发了 SpriteKit 物理接触。我为要移出屏幕的 Dot 对象的实例抓取物理体,但是当我尝试像这样更改其位置时,没有任何反应: 第一种方法 /* I
我是一名优秀的程序员,十分优秀!