【问题标题】:Implement Office 365 styled Basic Authentication (Active Profile)实施 Office 365 样式的基本身份验证(活动配置文件)
【发布时间】:2015-06-29 02:10:44
【问题描述】:

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

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

【问题讨论】:

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


    【解决方案1】:

    我相信这篇 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

    编辑:

    这段代码取自链接文章(cmets 是我的),是活动联合的演示。客户端应用程序正在从 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();
    

    【讨论】:

    • 为了进一步澄清,上面的链接是使用 Active Federation。显示如何实现名为“GetToken”的方法的代码示例,客户端应用程序使用该方法按需检索令牌,是 Active Federation 的一个示例。
    • 你是对的,这是“主动联合”的一个例子。但是,代码示例特定于针对由 ADFS 保护的 WCF 服务进行身份验证。我正在寻找针对 ADFS 端点对用户进行身份验证 - 以获取安全令牌。请参阅我的答案以获取更多信息/示例代码。
    • 我在此处共享的链接还包括用于向 ADFS 端点进行身份验证以检索令牌的代码示例。但是,无论哪种方式,您都会得到答案!
    【解决方案2】:

    看看这些链接:

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

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

    注意单租户和多租户应用,并选择合适的。

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

    【讨论】:

    • 这看起来像传统的“被动联合”,其中用户被重定向到由身份提供者托管的登录页面。
    【解决方案3】:

    我在博客上找到了答案:http://leandrob.com/2012/04/requesting-a-token-from-adfs-2-0-using-ws-trust-with-username-and-password/

    这段代码的本质是它直接向租户的 ADFS 端点进行身份验证并获得一个令牌。这就是我一直在寻找的。​​p>

    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/ - 涵盖了其他类似情况。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-24
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      相关资源
      最近更新 更多