使用ADFS实现主动身份验证

时间:2016-02-16 05:30:48

标签: asp.net authentication adfs

我正在使用ADFS使用Active Directory进行身份验证。

在搜索时,我收到了很少的文章来完成这个要求,但他们建议将应用程序的登录页面重定向到ADFS的登录页面然后再回来。

根据用户体验,不建议重定向到ADFS登录页面。

任何人都可以帮助我找到使用活动目录后面的ADFS进行身份验证的解决方案吗?因此,一切都将由应用程序代码处理,而不是由ADFS登录页面处理。

请告知。

如果您有任何疑虑或疑问,或者您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

这些文章建议您将(使用WS-Federation协议)重定向到ADFS登录页面的原因是因为它允许您设置与其他身份提供程序的联合(允许外部公司的员工使用自己的凭据登录到你的申请)。

您可以使用WS-Trust协议完成所需的工作,但您将放弃(或必须自己实施)联合的可能性。

ADFS会公开您可以与之交谈的端点/adfs/services/trust/13/usernamemixed以获取安全令牌。像下面这样的东西应该让你去。

public class UserNameWSTrustBinding : WS2007HttpBinding
{
    public UserNameWSTrustBinding()
    {
        Security.Mode = SecurityMode.TransportWithMessageCredential;
        Security.Message.EstablishSecurityContext = false;
        Security.Message.ClientCredentialType = MessageCredentialType.UserName;
    }
}

private static SecurityToken GetSamlToken(string username, string password)
{
    var factory = new WSTrustChannelFactory(new UserNameWSTrustBinding(), "https://yourdomain.com/adfs/services/trust/13/UsernameMixed")
        {
            TrustVersion = TrustVersion.WSTrust13
        };

    factory.Credentials.UserName.UserName = username;
    factory.Credentials.UserName.Password = password;

    var rst = new RequestSecurityToken
    {
        RequestType = RequestTypes.Issue,
        AppliesTo = new EndpointReference("https://yourdomain.com/yourservice"),
        KeyType = KeyTypes.Bearer
    };

    var channel = factory.CreateChannel();

    return channel.Issue(rst);
}