- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个托管在 IIS 中的网站,它使用 Windows 身份验证并公开 WCF Web 服务。
我使用端点行为配置此服务:
<serviceAuthorization principalPermissionMode ="UseAspNetRoles"
roleProviderName="MyRoleProvider"/>
<security mode="TransportCredentialOnly">
<transport clientCredentialType="Ntlm" />
</security>
Thread.CurrentPrincipal
设置为
RolePrincipal
由配置的提供程序提供的客户端的 Windows 身份和角色。
Factory="System.ServiceModel.Activation.WebScriptServiceHostFactory"
在 svc 文件中,
WebGet
服务契约(Contract)中的属性,以及
AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)
服务实现的属性。
<system.serviceModel>
...
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
...
</system.serviceModel>
HttpContext.Current.User
设置为
RolePrincipal
与我期望的角色。但是
Thread.CurrentPrincipal
仍然设置为未经身份验证的
GenericPrincipal
.
Thread.CurrentPrincipal = HttpContext.Current.User
Thread.CurrentPrincipal
自动设置,就像普通的 SOAP 服务一样?
http://myserver/MyService.svc/...
最佳答案
这是个有趣的问题。我没有与您相同的设置,因此很难测试我的建议是否完全适用于您的用例,但我可以与类似项目分享对我们有用的东西。
我们如何保持 Thread.CurrentPrincipal
和 HttpContext.Current.User
同步中
我们编写了一个名为“AuthenticationModule”的HttpModule,它继承自IHtppModule
。 .
然后我们附加到 HttpApplication.AuthenticateRequest
在请求生命周期的早期发生的事件。
在我们的 AuthenticateRequest 事件处理程序中,我们实现了应用程序的特定要求,包括设置 Thread.CurrentPrincipal
如有必要,还包括当前上下文用户。通过这种方式,您只需为整个应用程序实现此代码一次,如果它发生更改(例如,如果您实现自定义 Principal IIDentity),您只有一个地方可以更改它。 (不要在每个服务方法中重复此代码。)
public class AuthenticationModule : IHttpModule
{
public void Dispose() { return; }
public void Init(HttpApplication app)
{
app.AuthenticateRequest += new EventHandler(app_AuthenticateRequest);
}
void app_AuthenticateRequest(object sender, EventArgs e)
{
HttpApplication app = (HttpApplication)sender;
// This is what you were asking for, but hey you
// could change this behavior easily.
Thread.CurrentPrincipal = app.Context.User;
}
}
IIdentity
时,我们的实际上有点复杂。 , 创建
GenericPrincipal
的实例然后将其分配给
app.Context.User
和
Thread.CurrentPrincipal
;但是,以上是您所要求的。
web.config
中注册您的新 HttpModule !
<system.webServer>
<modules>
<add name="AuthenticationModule" type="YourNameSpace.AuthenticationModule" preCondition="integratedMode" />
</modules>
</system.webServer>
<system.web><httpModules></httpModules></system.web>
HttpRequests
是否是页面请求,
IHttpHandler
,一些 3rd 方组件等...这将在您的整个应用程序中保持一致。
关于asp.net - Thread.CurrentPrincipal 未在使用 WebGet 调用的 WCF 服务中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9030125/
这个问题类似于Set Thread.CurrentPrincipal Asynchronously? .然而,在我的例子中,我试图让它在单元测试中工作,并希望通过自定义 Synchronization
我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现: public class FooHandler : DelegatingHandler { prote
我正在尝试对 DelegateHandler 的实现进行单元测试。我的简化实现: public class FooHandler : DelegatingHandler { prote
我有一个自定义 ServiceAuthorizationManager,我在其中覆盖 CheckAccess 并验证作为 URL 一部分的自定义身份验证 token 。验证后,我将 Thread.Cu
在什么情况下,当前线程的主体丢失。我有一个 Windows 窗体应用程序,它使用主体作为主线程并通过 WCF 从服务器接收通知。在某些客户端上,我丢失了当前线程的 Principal,但我不明白为什么
使用 ASP.NET WebAPI,在身份验证期间设置 Thread.CurrentPrincipal,以便 Controller 稍后可以使用 ApiController.User 属性。 如果该身
我在我的服务器上看到似乎是由匿名客户端发出的请求,尽管我确定它们是由经过身份验证的用户发出的 - 我有 fiddler 日志显示客户端发送了有效的 asp.net auth cookie,和服务器日志
在 .NET 3.5 Winforms 应用程序中,在用户提供用户名和密码后,我在 CurrentPrincipal 属性中设置自定义主体,如下所示: My.User.CurrentPrincipal
这是我在命令提示符下运行的一个简单的控制台应用程序: using System; using System.Threading; namespace Test { internal class
我有一个 WCF 服务需要知道调用用户的委托(delegate)人。 在我拥有的服务的构造函数中: Principal = OperationContext.Current.IncomingMessa
在初始化我的应用程序期间,我设置了 System.Threading.Thread.CurrentPrincial。但是在应用程序初始化后,我想访问这个 Principal,CurrentPrinci
我正在尝试使用 System.Threading.Thread.CurrentPrincipal.Identity.Name 获取正在使用 ASP.NET 应用程序的用户的登录信息。我没有收到任何构建
我遇到 Thread.CurrentPrincipal 没有从主线程传播到工作流应用程序的问题。 有什么办法吗? 这是我的示例应用程序: class Program { static void
是否有人可以阻止当前线程的 IPrincipal 在应用程序域边界上传播?我无法控制分配给线程的 IPrincipal,但我可以控制创建应用程序域。 (我这样做的原因是为了防止在主体对象类型的程序集在
我有可以从多种客户端类型(例如 WinForms、控制台、ASP.NET 等)调用的库代码,并且需要确定当前主体。在这样做时,我对 Thread.CurrentPrincipal 和 Environm
什么是Thread.CurrentPrincipal用于?它如何帮助应用程序的身份验证和授权?是否有任何文章或资源可以帮助解释它的作用? 最佳答案 Thread.CurrentPrincipal 是
在 ASP.net 应用程序中,我将登录控件与我编写的自定义成员资格提供程序一起使用。我想要做的是在用户通过身份验证后将 Thread.CurrentPrincipal 设置为我的自定义主体对象。 我
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
我们正在尝试使用 Thred.CurrentPrincipal 来获取用户信息。然而,一旦我们将其部署到 Azure,CurrentPrincipal 就为空。 var td = new TokenD
我对新的 async/await 东西还很陌生。但是,我有以下类(class): public abstract class PluginBase { //Using EF to store l
我是一名优秀的程序员,十分优秀!