- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个网站和 API,使用我们公司的 ADFS 支持的 token 服务进行保护。我需要使用 C# 控制台应用程序访问 API 上的端点。我发现缺少使用 C# 代码访问 STS 安全网站的资源。它使用 ADFS 3.0。
当我使用 HttpClient
(或类似的)访问端点时,我会收到一个 HTML 表单作为返回。
我的代码:
Uri baseAddress = new Uri("http://localhost:64022");
using (HttpClient client = new HttpClient() { BaseAddress = baseAddress })
{
HttpRequestMessage request = new HttpRequestMessage(HttpMethod.Get, "#");
HttpResponseMessage response = client.SendAsync(request).Result;
var encoding = ASCIIEncoding.ASCII;
using (var reader = new System.IO.StreamReader(response.Content.ReadAsStreamAsync().Result, encoding))
{
string responseText = reader.ReadToEnd();
}
}
我在我的应用程序的 web.config 文件中的设置是:
<system.identityModel.services>
<federationConfiguration>
<cookieHandler requireSsl="false" persistentSessionLifetime="1.0:0:0" />
<wsFederation persistentCookiesOnPassiveRedirects="true" passiveRedirectEnabled="true" issuer="https://sts.company.com/adfs/ls/" realm="http://myapp.company.com/" requireHttps="false" />
</federationConfiguration>
</system.identityModel.services>
<system.identityModel>
<identityConfiguration>
<audienceUris>
<add value="http://myapp.company.com/" />
</audienceUris>
<issuerNameRegistry>
<trustedIssuers>
<add thumbprint="0000000000000000000000000000000000000000" name="https://sts.company.com/adfs/services/trust" />
</trustedIssuers>
</issuerNameRegistry>
</identityConfiguration>
</system.identityModel>
我不确定各种术语是什么。我的远程地址是什么?我的客户编号?什么是指纹?
最佳答案
我想出了如何做到这一点。我不能肯定地说这是否是可能的最佳实现方式,但它对我有用。
类 ADFS token 提供者
public class ADFSUsernameMixedTokenProvider
{
private readonly Uri adfsUserNameMixedEndpoint;
/// <summary>
/// Initializes a new instance of the <see cref="ADFSUsernameMixedTokenProvider"/> class
/// </summary>
/// <param name="adfsUserNameMixedEndpoint">i.e. https://adfs.mycompany.com/adfs/services/trust/13/usernamemixed </param>
public ADFSUsernameMixedTokenProvider(Uri adfsUserNameMixedEndpoint)
{
this.adfsUserNameMixedEndpoint = adfsUserNameMixedEndpoint;
}
/// <summary>
/// Requests a security token from the ADFS server
/// </summary>
/// <param name="username">The username</param>
/// <param name="password">The password</param>
/// <param name="endpoint">The ADFS endpoint</param>
/// <returns></returns>
public GenericXmlSecurityToken RequestToken(string username, SecureString password, string endpoint)
{
WSTrustChannelFactory factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
new EndpointAddress(adfsUserNameMixedEndpoint));
factory.TrustVersion = TrustVersion.WSTrust13;
factory.Credentials.UserName.UserName = username;
factory.Credentials.UserName.Password = new System.Net.NetworkCredential(string.Empty, password).Password;
RequestSecurityToken token = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = new EndpointReference(endpoint),
KeyType = KeyTypes.Bearer
};
IWSTrustChannelContract channel = factory.CreateChannel();
return channel.Issue(token) as GenericXmlSecurityToken;
}
}
类认证
public class Authentication
{
private GenericXmlSecurityToken token;
private string site = "https://my.site.com"
private string appliesTo = "http://my.site.com"
private string authUsernameEndpoint = "https://sts-prod.site.com/adfs/services/trust/13/usernamemixed";
public Authentication(PSCredential credential)
{
ADFSUsernameMixedTokenProvider tokenProvider = new ADFSUsernameMixedTokenProvider(new Uri(authUsernameEndpoint));
token = tokenProvider.RequestToken(credential.UserName, credential.Password, appliesTo);
}
public CookieContainer GetFedAuthCookies()
{
string prepareToken = WrapInSoapMessage(token, appliesTo);
string samlServer = site.EndsWith("/") ? site : site + "/";
string stringData = $"wa=wsignin1.0&wresult={HttpUtility.UrlEncode(prepareToken)}&wctx={HttpUtility.UrlEncode("rm=1&id=passive&ru=%2f")}";
CookieContainer cookies = new CookieContainer();
HttpWebRequest request = WebRequest.Create(samlServer) as HttpWebRequest;
request.Method = "POST";
request.ContentType = "application/x-www-form-urlencoded";
request.CookieContainer = cookies;
request.AllowAutoRedirect = false;
byte[] data = Encoding.UTF8.GetBytes(stringData);
request.ContentLength = data.Length;
using (Stream stream = request.GetRequestStream())
{
stream.Write(data, 0, data.Length);
}
using (HttpWebResponse response = request.GetResponse() as HttpWebResponse)
{
using (Stream stream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(stream))
{
string responseFromServer = reader.ReadToEnd();
}
}
}
return cookies;
}
private string WrapInSoapMessage(GenericXmlSecurityToken token, string site)
{
string validFrom = token.ValidFrom.ToString("o");
string validTo = token.ValidTo.ToString("o");
string securityToken = token.TokenXml.OuterXml;
string soapTemplate = @"<t:RequestSecurityTokenResponse xmlns:t=""http://schemas.xmlsoap.org/ws/2005/02/trust""><t:Lifetime><wsu:Created xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">{0}</wsu:Created><wsu:Expires xmlns:wsu=""http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"">{1}</wsu:Expires></t:Lifetime><wsp:AppliesTo xmlns:wsp=""http://schemas.xmlsoap.org/ws/2004/09/policy""><wsa:EndpointReference xmlns:wsa=""http://www.w3.org/2005/08/addressing""><wsa:Address>{2}</wsa:Address></wsa:EndpointReference></wsp:AppliesTo><t:RequestedSecurityToken>{3}</t:RequestedSecurityToken><t:TokenType>urn:oasis:names:tc:SAML:1.0:assertion</t:TokenType><t:RequestType>http://schemas.xmlsoap.org/ws/2005/02/trust/Issue</t:RequestType><t:KeyType>http://schemas.xmlsoap.org/ws/2005/05/identity/NoProofKey</t:KeyType></t:RequestSecurityTokenResponse>";
return string.Format(soapTemplate, validFrom, validTo, site, securityToken);
}
}
用法
Authentication auth = new Authentication(credential);
CookieContainer container = auth.GetFedAuthCookies();
HttpWebRequest request = WebRequest.Create("https://api.my.site.com/") as HttpWebRequest;
request.Method = method;
request.ContentType = "application/json";
request.CookieContainer = cookieContainer;
request.AllowAutoRedirect = false;
using (WebResponse response = request.GetResponse())
{
using (Stream dataStream = response.GetResponseStream())
{
using (StreamReader reader = new StreamReader(dataStream))
{
return JsonConvert.DeserializeObject<dynamic>(reader.ReadToEnd());
}
}
}
我将其与 PowerShell cmdlet 一起使用,这是 PSCredential 对象的来源。我希望这对想要从 C# 控制台应用程序使用 ADFS 3.0 进行身份验证的人有所帮助 - 我花了比我愿意承认的时间更长的时间。
关于c# - 使用控制台应用程序进行 ADFS STS 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39261413/
我是 ADFS 的新手。实际上我不知道什么是主动或被动联邦,也不知道它们之间的区别,有人可以帮助我吗? 提前致谢 !!!... 最佳答案 被动使用浏览器 - 进行重定向等。协议(protocol)是
我有一个引用 ADAL.net 库的 c# 控制台应用程序(Microsoft.IdentityModel.Clients.ActiveDirectory 版本 2.19.208020213) 控制台
ADF initContext 和 prepareModel 之间的区别,因为两者都通过执行业务服务来准备数据,并通过绑定(bind)容器(Map 对象)使其可用。 最佳答案 ADF initCont
我想从按钮 ActionListener 执行数据控制操作(CreateInsert 和 Delete)。我知道可以从 Data Controls 菜单中插入一个数据控制按钮,但是由于各种原因我需要这
我需要将现有管道的副本(管道数量:10-20)从一个订阅克隆到另一个订阅(另一个 ADF)。有没有办法使用 Azure DevOps 来完成此事件? 最佳答案 选项1: 使用Git Configura
在我的解决方案中,我有两个 Azure 数据工厂项目:PR1 和 PR2。 PR1 包含某些资源的定义 - “resource1”。在 PR2 中,我有管道定义,我想在其中引用此资源: "linked
我正在使用 inputFile 组件上传文件。当我完成上传文件时,输入文本字段将缩小 其大小并更改大小以调整文件名。有没有办法为输入文本字段设置固定大小? 部分代码如下: 最佳答案 例如,使用 Pa
我是 ORACLE ADF FUSION MIDDLEWARE 的新手,所以我在表单设计方面没有经验。谁能帮我对齐布局中的一些元素。 我想始终将 ORACLE Logo 对齐到右侧。如果窗口分辨率降低
我的页面上有一个 af:outputText。 它的值需要很长时间才能生成,所以我不想在最初创建页面时生成。 相反,我希望页面在加载后对服务器进行异步回调,然后返回值将填充 outputText。 在
在 oracle adf 中,当我们将一个表从 Data Controls 拖放到 jsf 页面时,当我们运行项目时,预选了一行表。我应该怎么做才能在第一次加载页面时没有选择任何行? 我使用 jdev
我在 Windows Server 2016 上使用 OpenID Connect 设置 ADFS 时遇到困难。 我已经设置了用于测试的 AD 并且我可以成功进行身份验证,但是电子邮件声明不在 id
ADF 管道和 ADF 数据流有什么区别?为什么管道和数据流中支持的接收器/源不同?是否可以创建一个管道来从源读取数据、过滤、使用连接并将数据存储到没有数据流的接收器?请告诉我。 最佳答案 管道用于流
我有一个具有三个值的 selectonechoice:A、B、C,但我在其更改事件中遇到以下错误: Could not find selected item matching value "B"
我有 ADF 应用程序,它是一个电影数据库。我在设置 ADF 组件 af:inputText 时遇到了一个大问题。 我尝试了很多不同组件的不同宽度设置,但我总是失败。 有图片... 请问您不知道该怎么
我试图显示(在控制台中打印)对应于 ADF-BC 的 SQL 查询。我不知道如何使用 Jdeveloper 11.1.1.1.0 和 Oracle 11g 执行此操作。我只是想看看在将它们发送到 Or
我有两台名为 auth.somedomain.no 的 ADFS 2.0 代理服务器和两台名为 adfs.somedomain.no 的 ADFS 2.0 服务器。 然而,https://auth.s
我正在尝试将新的 MVC 应用程序发布到 Azure 应用服务。该应用程序使用ADFS单点登录身份验证,我在ADFS服务器上添加了依赖方信任,并且在本地主机上测试时可以登录。 发布到我的应用程序服务并
有人成功做到这一点吗? SelfSTS是一个 WCF 应用程序而不是 ASP.NET 应用程序,并且似乎没有很多用于进行 WCF 集成的示例或代码示例? 这非常有用,因为 SelfSTS 允许您动态创
我试图将我的 Identityserver4 配置为使用 ADFS 4.0 作为外部提供程序。 我已将其配置如下: app.UseCookieAuthentication(ne
我需要使用“-Djbo.debugoutput=console”启动我的 adf 应用程序。 我该怎么做?我使用的是jdevloper 11.1.1.6 最佳答案 您需要做的就是将上述字符串作为 Ja
我是一名优秀的程序员,十分优秀!