客户端证书映射身份验证

是否有可能(并且如果是这样,如何?)配置自托管的owin端点以使用A / D客户端证书映射身份验证? IIS有这个功能链接,但到目前为止,我还没有发现自托管端点的等价物。

尽管我已经得到这个工作的方式(考虑到这种方法可能不是百分之百安全的),但是通过使用authenticationSchemeSelectorDelegate和OWIN的组合,这是一个两步过程。

这将选择适当的AuthenticationScheme(允许包含证书的请求,否则推迟到NTLM身份验证)

public void Configuration(IAppBuilder appBuilder)
{
    var listener = (HttpListener)appBuilder.Properties[typeof(HttpListener).FullName];
    listener.AuthenticationSchemeSelectorDelegate += AuthenticationSchemeSelectorDelegate;
}

private AuthenticationSchemes AuthenticationSchemeSelectorDelegate(HttpListenerRequest httpRequest)
{
    if (!httpRequest.IsSecureConnection) return AuthenticationSchemes.Ntlm;
    var clientCert = httpRequest.GetClientCertificate();
    if (clientCert == null) return AuthenticationSchemes.Ntlm;
    else return AuthenticationSchemes.Anonymous;
}

这将读取证书的内容并相应地填充“server.User”环境变量

public class CertificateAuthenticator
{
    readonly Func<IDictionary<string, object>, Task> _appFunc;

    public CertificateAuthenticator(Func<IDictionary<string, object>, Task> appFunc)
    {
        _appFunc = appFunc;
    }

    public Task Invoke(IDictionary<string, object> environment)
    {
        // Are we authenticated already (NTLM)
        var user = environment["server.User"] as IPrincipal;
        if (user != null && user.Identity.IsAuthenticated) return _appFunc.Invoke(environment);

        var context = environment["System.Net.HttpListenerContext"] as HttpListenerContext;
        if (context == null) return _appFunc.Invoke(environment);

        var clientCertificate = context.Request.GetClientCertificate();

        // Parse out username from certificate

        var identity = new GenericPrincipal
        (
            new GenericIdentity(username), new string[0]
        );

        environment["server.User"] = identity;
    }
}

没有更好的/标准化的方法吗?


我还没有看到为此构建的任何标准组件。 也就是说,应该可以稍微清理一下你的代码:

  • 您不需要贬低到HttpListenerContext来获取客户端证书。 客户端证书应该已经在OWIN环境下的“ssl.ClientCertificate”下可用。 请参阅https://katanaproject.codeplex.com/wikipage?title=OWIN%20Keys。 您还需要检查ssl.ClientCertificateErrors,因为证书可能没有通过所有验证检查。
  • 您不需要AuthenticationSchemeSelectorDelegate代码。 你可以设置listner.AuthenticationSchemes = NTLM | 匿名。 然后,在证书中间件之后添加一个中间件,该中间件返回401如果server.User无效。
  • 链接地址: http://www.djcxy.com/p/17013.html

    上一篇: Client Certificate Mapping Authentication in self

    下一篇: , attachment" to downloaded file