- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一个使用 Windows Server 2012 R2、ADFS 和 Sharepoint 2013 设置的测试环境。我可以使用 ADFS 作为声明身份提供程序成功登录到 Sharepoint 2013。现在我正在尝试从我的 C# 应用程序登录到 Sharepoint。
我可以使用以下方法从 adfs 请求 saml 断言 token 。
现在我需要帮助将 saml token 发布到 SharePoint 并检索 FedAuth cookie,这样我就可以被动登录到 SharePoint 2013 并从 C# 应用程序上传文档。
当我调用最后一个方法 PostSharePointSTS() 时,没有设置 Cookie。
大部分代码都得到了Leandro Boffi的帮助
[TestMethod]
public void GetSamlTestMethod()
{
var client = new WebClient();
client.Headers.Add("Content-Type", "application/soap+xml; charset=utf-8");
string username = "Administrator@2012r2.local";
string password = "Password1";
string adfsServer = "https://logon.2012r2.local/adfs/services/trust/2005/UsernameMixed";
string sharepoint = "https://portal.2012r2.local/_trust/";
var samlRequest = GetSAML()
.Replace("[Username]", username)
.Replace("[Password]", password)
.Replace("[To]", adfsServer)
.Replace("[applyTo]", sharepoint);
var result = client.UploadString(
address: "https://logon.2012r2.local/adfs/services/trust/2005/UsernameMixed",
method: "POST",
data: samlRequest);
PostSharePointSTS( GetSAMLAssertion(result) );
}
private static string GetSAMLAssertion(string response)
{
XDocument samlResponse = XDocument.Parse( response);
// Check response xml for faults/errors
if(samlResponse.Root == null)
throw new ApplicationException("Invalid response received from authentication service.");
XNamespace s = "http://www.w3.org/2003/05/soap-envelope";
XNamespace psf = "http://schemas.microsoft.com/Passport/SoapServices/SOAPFault";
XNamespace wst = "http://schemas.xmlsoap.org/ws/2005/02/trust"; // "http://docs.oasis-open.org/ws-sx/ws-trust/200512";//
XNamespace wsp = "http://schemas.xmlsoap.org/ws/2004/09/policy";
XNamespace wsa = "http://www.w3.org/2005/08/addressing";
XNamespace wsse = "http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd";
const string saml = "urn:oasis:names:tc:SAML:1.0:assertion";
// the logon token is in the SAML assertion element of the message body
XDocument xDoc = XDocument.Parse(response, LoadOptions.PreserveWhitespace);
var assertion = from e in xDoc.Descendants()
where e.Name == XName.Get("Assertion", saml)
select e;
string samlAssertion = assertion.FirstOrDefault().ToString();
// for some reason the assertion string needs to be loaded into an XDocument
// and written out for for the XML to be valid. Otherwise we get an invalid
// XML error back from ADFSs
XDocument doc1 = XDocument.Parse(samlAssertion);
samlAssertion = doc1.ToString(SaveOptions.DisableFormatting);
return samlAssertion;
}
private static string GetSAML()
{
const string saml = @"<?xml version='1.0' encoding='utf-8' ?>
<s:Envelope xmlns:s='http://www.w3.org/2003/05/soap-envelope' xmlns:a='http://www.w3.org/2005/08/addressing' xmlns:u='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd'>
<s:Header>
<a:Action s:mustUnderstand='1'>http://schemas.xmlsoap.org/ws/2005/02/trust/RST/Issue</a:Action>
<a:ReplyTo>
<a:Address>http://www.w3.org/2005/08/addressing/anonymous</a:Address>
</a:ReplyTo>
<a:To s:mustUnderstand='1'>[To]</a:To>
<o:Security s:mustUnderstand='1' xmlns:o='http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd'>
<o:UsernameToken>
<o:Username>[Username]</o:Username>
<o:Password>[Password]</o:Password>
</o:UsernameToken>
</o:Security>
</s:Header>
<s:Body>
<t:RequestSecurityToken xmlns:t='http://schemas.xmlsoap.org/ws/2005/02/trust'>
<wsp:AppliesTo xmlns:wsp='http://schemas.xmlsoap.org/ws/2004/09/policy'>
<a:EndpointReference>
<a:Address>[applyTo]</a:Address>
</a:EndpointReference>
</wsp:AppliesTo>
<t:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</t:KeyType>
<t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType>
<t:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</t:TokenType>
</t:RequestSecurityToken>
</s:Body>
</s:Envelope>";
return saml;
}
private static void PostSharePointSTS(string assertion)
{
// Submit the BinarySecurityToken to SPO and retrieve response
var loginUri = new Uri("https://logon.2012r2.local/adfs/ls?wa=wsignin1.0&wtrealm=urn:sharepoint:portal");
var requestCookies = new CookieContainer();
var request = (HttpWebRequest)WebRequest.Create(loginUri);
request.AllowAutoRedirect = false;
request.ContentType = "application/x-www-form-urlencoded";
request.ContentLength = assertion.Length;
request.CookieContainer = requestCookies;
request.Method = "POST";
request.UserAgent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)";
using(var requestWriter = new StreamWriter(request.GetRequestStream()))
{
requestWriter.Write(assertion);
requestWriter.Close();
}
var response = (HttpWebResponse)request.GetResponse();
switch(response.StatusCode)
{
case HttpStatusCode.OK:
case HttpStatusCode.Found:
break;
// TODO: Log error?
//default:
//return false;
}
}
当我尝试将给定的 SAML token 发布到 SharePOint 时,我得到以下信息。但是没有设置 cookie。
HTTP/1.1 302 Found
Content-Length: 0
Content-Type: text/html; charset=utf-8
Location: https://logon.2012r2.local:443/adfs/ls/wia?wa=wsignin1.0&wtrealm=urn:sharepoint:portal
Server: Microsoft-HTTPAPI/2.0
Date: Sat, 16 Aug 2014 10:55:51 GMT
This response did not set any cookies.
This response did not contain a P3P Header.
Validate P3P Policies at: http://www.w3.org/P3P/validator.html
Learn more at: http://fiddler2.com/r/?p3pinfo
最佳答案
为什么不直接使用标准 SharePoint CSOM 库在 SharePoint 中做任何您想做的事? CSOM 代表 SharePoint 端的用户自动执行所有必要的 ADFS 交互。
关于c# - 如何从本地 SharePoint 2013 和 ADFS 获取 FedAuth Cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25339348/
我在尝试跟踪过期的 WIF 身份验证 session /cookie 时遇到了一个有趣的问题。 作为背景知识:该站点是 MVC 3,使用与 ADFS 服务器作为 STS 的信任的 Windows Id
我是基于声明的身份验证的新手。谁能解释一下什么是 SAML token 和 FedAuth cookie?它们之间的关系是什么? 最佳答案 SAML token 是一段 XML,包含有关用户身份的信息
我有一个 ASP.NET 应用程序,它使用 Azure ACS(和间接 ADFS)进行身份验证 - 一切正常。现在我被要求将 SessionToken 传递给另一个后端服务,在那里可以验证它并提取声明
我们正在使用 Windows Identity Foundation 为我们的应用程序实现单一登录解决方案。我遇到的问题是 FedAuth cookie 在我认为应该在依赖方方面过期时没有过期。 Fe
我有一个在 Azure 上运行的 ASP.NET 站点,网址为 https://[appname].cloudapp.net。我在 https://[appname].cloudapp.net/Web
我有一个使用 SSL 保护的 ASP.Net MVC 站点,我正在使用 System.IdentityModel.Services 并像这样创建 token : SessionSecurityToke
我正在努力弄清楚为什么 ClaimsPrincipal只有 7 项 claim 正在产生 5 FedAuth来自 FAM 的 Cookie(FedAuth1、FedAuth2、FedAuth3、F
场景如下:我需要对用户(使用他的大学帐户)执行联合身份验证到他大学的 Sharepoint 站点,并同时获取 FedAuth 和 rtFa cookie(我必须将其传递给 SharePoint RES
我很难更改 ASP.NET MVC 应用程序上的 SameSite 属性。这是场景: 我正在尝试将我的 ASP.NET 应用程序加载到 iframe 中,并且由于 Google Chrome 80+
我将 WIF 与 WS Federation 结合使用,以便我的 ASP.NET 应用程序可以针对 STS (Thinktecture IdentityServer) 进行身份验证。在我的 RP 中,
我有一个使用 Windows Server 2012 R2、ADFS 和 Sharepoint 2013 设置的测试环境。我可以使用 ADFS 作为声明身份提供程序成功登录到 Sharepoint 2
我认为默认超时是每半小时一次。 我想将其更改为 2 周。有人有任何想法吗? 这通常是从 STS 端还是客户端完成?表单例份验证是否也受到了阻碍,还是现在无关紧要? 最佳答案 我自己刚刚修复了这个问题,
我是一名优秀的程序员,十分优秀!