asp.net – 使用Windows凭据和.net 4.5 WIF的RequestSecurityToken
|
任何人都可以指向使用Thread.CurrentPrincipal的NT凭证作为ClaimsPrincipal主动发出RequestSecurityToken的示例代码吗? 该场景是一个启用了Windows身份验证的asp.net Web应用程序(因此有一个经过身份验证的WindowsIdentity).我的愿望是主动调用STS而不是启用passiveRedirect,并使用.Net 4.5身份库执行此操作. 大多数代码示例(例如Claims Helper for Windows Phone或Using an Active STS)使用username / pwd输入和UserNameWSTrustBinding设置凭据. 我认为该解决方案可能涉及模拟或使用从Windows标识创建的标记调用channelFactory.CreateChannelWithActAsToken(). – 当访问/ adfs / services / trust / 13 / windowsmixed端点时,以下.Net4.5代码确实获得了GenericXmlSecurityToken. public static void CallSts()
{
try
{
var wsMod = FederatedAuthentication.WSFederationAuthenticationModule;
var appliesToEp = new EndpointReference(wsMod.Realm);
var stsEp = new EndpointAddress(new Uri(wsMod.Issuer),EndpointIdentity.CreateSpnIdentity("stsSpn"));
var msgBinding = new WS2007HttpBinding(SecurityMode.TransportWithMessageCredential,false);
msgBinding.Security.Message.EstablishSecurityContext = false;
msgBinding.Security.Message.ClientCredentialType = MessageCredentialType.Windows;
using(var factory = new WSTrustChannelFactory(msgBinding,stsEp))
{
factory.Credentials.SupportInteractive = false;
factory.TrustVersion = TrustVersion.WSTrust13;
var myRst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,AppliesTo = appliesToEp,KeyType = KeyTypes.Bearer,};
var channel = factory.CreateChannel();
var stsToken = channel.Issue(myRst) as GenericXmlSecurityToken;
if(stsToken != null)
{
Log.DebugFormat("Reply Token is {0}",stsToken.GetType().Name);
var handlers = FederatedAuthentication.FederationConfiguration.IdentityConfiguration.SecurityTokenHandlers;
var token = handlers.ReadToken(new XmlTextReader(new StringReader(stsToken.TokenXml.OuterXml)));
var identity = handlers.ValidateToken(token).First();
//TODO write to session
}
else
{
Log.Debug("Reply Token is null.");
}
}
}
catch(Exception ex)
{
Log.Error("Rst.Call has failed",ex);
}
}
对于@leastprivilege建议,我添加以下代码: var user = Thread.CurrentPrincipal as ClaimsPrincipal;
var winId = user.Identity as WindowsIdentity;
if(winId != null)
{
// shows my domain account after I was prompted for credentials;
// my domain account does not exist on the client machine,so it is a true domain credential
Log.DebugFormat("WindowsIdentity Name is {0}",winId.Name);
}
using(winId.Impersonate())
{
// again,shows my domain account
Log.DebugFormat("Impersonation Context {0}",WindowsIdentity.GetCurrent(true).Name);
var channel = factory.CreateChannel();
var stsToken = channel.Issue(myRst) as GenericXmlSecurityToken;
// request is issued,but results in SecurityNegotiationException: The caller was not authenticated by the service.
}
哪个失败,“调用者未通过服务进行身份验证”.相同的STS将在被动重定向场景中验证我的域帐户…所以尽管我知道我做错了什么,但应该识别帐户本身. 更新: 我收到一条通知,告知此问题收到了大量意见,因此我将提供以下一个解决方法: msgBinding.Security.Message.NegotiateServiceCredential = true; 到上面的ChannelBinding配置. 解决方法嗯 – 这实际上并非无足轻重.您需要为此进行Kerberos模拟和委派.首先是模仿.您需要在从Thread.CurrentPrincipal获得的WindowsIdentity上调用Impersonate(). 您可以通过调用WindowsIdentity.GetCurrent来确保您正在冒充.此标识必须指向客户端(而不是服务器标识). 然后在冒充时你需要发出WS-Trust请求.默认情况下,这很可能是不允许的.因此,网络管理员需要为STS配置服务器标识的委派. (编辑:安卓应用网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net – 用于分析在azure上运行的网站性能的步骤
- asp.net-mvc-3 – asp.net mvc 3 razor从IEnumerable获取一
- asp.net – 从C#代码增加Http Runtime MaxRequestLength
- Forms身份验证应用程序中的ASP.NET Web服务
- asp.net – 如何添加ROW_NUMBER到LINQ查询或实体?
- 启动ASP.NET窗体身份验证
- ASP.NET page_init事件?
- asp.net-mvc – 同时发送文件并重定向到新页面的MVC方式是什
- asp.net-mvc – Asp.Net MVC3 RC Razor视图:在块内嵌入代码
- asp.net-mvc – 嵌套对象的远程ViewModel验证无效
- asp.net – asp:ContentPlaceHolder和代码块问题
- asp.net – OutOfMemoryException当发送大文件50
- asp.net – 占位符/示例文本在用户的文本框中
- asp.net – 为什么HttpUtility.UrlEncode(HttpUt
- asp.net-mvc-3 – Asp.Net MVC 3 – @ Html.Acti
- asp.net-web-api – 如何为代理控制器设置Web AP
- asp.net-mvc – 为什么人们在MVC中使用Web API控
- asp.net-mvc – TinyURL喜欢使用ASP.NET MVC进行
- ASP.NET MVC中引用JavaScript的正确方法?
- asp.net – 如何从HttpClient.PostAsJsonAsync()
