我正在开发一个围绕ASP.net MVC&WebAPI,想让企业更容易使用我的服务。例如Office 365基本身份验证(Active Profile),用户在微软网站(或桌面应用程序)上输入用户名/密码,并根据雇主的Active Directory进行身份验证。到目前为止,我的理解是,我需要创建一个RP-STS,它将接受凭据,然后将这些凭据转发到客户端公司的AD服务器上运行的AD FS代理。这是正确的吗?
如果是,那么我该如何实现?设置AD服务器添加依赖方和AD FS代理角色很容易,所以这真的不是问题。我只需要弄清楚如何创建/设置RP-STS服务以及这个过程中涉及的任何其他步骤。在.net 中没有这样的例子/教程
我相信这篇msdn博客文章准确地描述了您的要求。它对整个过程进行了完整的演练,包括通过创建一个正常的WCF服务来创建RP,然后使用提供的实用工具来配置服务以信任您的ADFS。
http://blogs.msdn.com/b/mcsuksoldev/archive/2011/08/17/federated-security-how-to-setup-and-call-a-wcf-service-secured-by-adfs-2-0.aspx
编辑:
这段代码取自链接文章(评论是我的),是一个活跃联邦的演示。客户端应用程序正在从ADFS手动检索安全令牌。被动联合将涉及将用户转发到一个安全的网页,用户可以在该网页中直接向ADFS发送凭据。被动联合的主要好处是,最终用户的秘密凭证直接提供给ADFS,而RP的客户端代码永远无法访问它
var requestTokenResponse = new RequestSecurityTokenResponse();
//The line below is the 'Active' federation
var token = Token.GetToken(@"mydomaintestuser", "p@ssw0rd", "http://services.testdomain.dev/wcfservice/Service.svc", out requestTokenResponse);
var wcfClient = new FederatedWCFClient<MyTestService.IService>(token, "WS2007FederationHttpBinding_IService"); // This must match the app.config
var client = wcfClient.Client as MyTestService.IService;
var result = client.GetData();
Console.WriteLine(result);
wcfClient.Close();
看看这些链接:
https://github.com/OfficeDev/O365-WebApp-SingleTenanthttps://github.com/OfficeDev/O365-WebApp-MultiTenant
它展示了如何使用office 365 api制作应用程序来对用户进行身份验证和授权。
请注意Single Tenant和Mult Tentant应用程序,并选择正确的应用程序。
这真的很容易,我几个月前就做过了。
我在博客上找到了答案:http://leandrob.com/2012/04/requesting-a-token-from-adfs-2-0-using-ws-trust-with-username-and-password/
该代码的本质是直接使用租户的ADFS端点进行身份验证,并获取令牌。这就是我想要的。
var stsEndpoint = "https://[server]/adfs/services/trust/13/UsernameMixed";
var relayPartyUri = "https://localhost:8080/WebApp";
var factory = new WSTrustChannelFactory(
new UserNameWSTrustBinding(SecurityMode.TransportWithMessageCredential),
new EndpointAddress(stsEndpoint));
factory.TrustVersion = TrustVersion.WSTrust13;
// Username and Password here...
factory.Credentials.UserName.UserName = user;
factory.Credentials.UserName.Password = password;
var rst = new RequestSecurityToken
{
RequestType = RequestTypes.Issue,
AppliesTo = new EndpointAddress(relayPartyUri),
KeyType = KeyTypes.Bearer,
};
var channel = factory.CreateChannel();
SecurityToken token = channel.Issue(rst);
该博客上的另一篇好文章是:http://leandrob.com/2012/02/request-a-token-from-adfs-using-ws-trust-from-ios-objective-c-iphone-ipad-android-java-node-js-or-any-platform-or-language/-涵盖其他类似情况。