实现Office 365样式的基本身份验证(活动配置文件)

时间:2015-06-29 02:10:45

标签: asp.net wif adfs ws-federation ws-trust

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

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

中没有这个示例/教程

3 个答案:

答案 0 :(得分: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();

答案 1 :(得分:2)

看一下这些链接:

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

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

请注意Single Tenant和Mult Tentant应用程序,并选择正确的应用程序。

这样做真的很容易,几个月前我就完成了。

答案 2 :(得分: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/ - 其中包含其他类似的情景。