2

我正在开发一个围绕 ASP.net MVC 和 WebAPI 构建的 SaaS 应用程序,并希望让企业能够轻松使用我的服务。示例是 Office 365 基本身份验证(活动配置文件),其中用户在微软的网站(或桌面应用程序)上输入他的用户名/密码,并且他通过其雇主的活动目录进行身份验证。到目前为止,我的理解是我需要创建一个 RP-STS,它将接受凭据,然后将这些凭据转发到在客户公司的 AD 服务器上运行的 AD FS 代理。它是否正确?

如果是,那么我该如何实现呢?设置 AD 服务器添加依赖方和 AD FS 代理角色很容易,所以这真的不是问题。我只需要弄清楚如何创建/设置 RP-STS 服务以及此过程中涉及的任何其他步骤。.net 中没有这方面的示例/教程

4

3 回答 3

3

我相信这篇 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(@"mydomain\testuser", "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();
于 2015-07-01T21:36:52.120 回答
2

看看这些链接:

https://github.com/OfficeDev/O365-WebApp-SingleTenant https://github.com/OfficeDev/O365-WebApp-MultiTenant

它展示了如何使用 office 365 api 制作应用程序来对用户进行身份验证和授权。

请注意单租户和多租户应用程序,并选择正确的应用程序。

这很容易做到,我几个月前就做过了。

于 2015-07-08T18:08:43.077 回答
0

我在博客上找到了答案: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/ - 涵盖其他类似场景。

于 2015-07-09T03:09:42.053 回答