Authentication OWIN自托管客户端证书身份验证403
我目前构建了一个简单的Web API,并尝试使用证书实现客户端身份验证。我没有使用IIS或其他任何东西作为代理,只是使用应用程序本身和OWIN。我一直在关注并且目前包含我试图用来进行身份验证的中间件的代码,并且我已经使用Authentication OWIN自托管客户端证书身份验证403,authentication,owin,Authentication,Owin,我目前构建了一个简单的Web API,并尝试使用证书实现客户端身份验证。我没有使用IIS或其他任何东西作为代理,只是使用应用程序本身和OWIN。我一直在关注并且目前包含我试图用来进行身份验证的中间件的代码,并且我已经使用 netsh http add sslcert ipport=0.0.0.0:6010 certhash=[removed] appid=[removed] clientcertnegotiation=enable 端口6010是我的API当前正在侦听的正确端口 身份验证中间件
netsh http add sslcert ipport=0.0.0.0:6010 certhash=[removed] appid=[removed] clientcertnegotiation=enable
端口6010是我的API当前正在侦听的正确端口
身份验证中间件
public class CertificateAuthenticationMiddleware: OwinMiddleware
{
conststring OwinCertFunc = "ssl.LoadClientCertAsync";
conststring OwinCert = "ssl.ClientCertificate";
conststring OwinCertError = "ssl.ClientCertificateErrors";
public CertificateAuthenticationMiddleware(OwinMiddleware next): base(next)
{}
///<summary>
/// The Invoke() method is invocked from startup class of OWIN for security.
///</summary>
///<param name="context"></param>
///<returns></returns>
public async override Task Invoke(IOwinContext context)
{
if (context.Environment.Keys.Contains(OwinCertFunc))
{
try
{
var task = (context.Environment[OwinCertFunc] as Func<Task>);
awaitTask.Run(task);
if (context.Environment.Keys.Contains(OwinCert))
{
var cert = context.Environment[OwinCert] asX509Certificate;
if (cert != null) context.Request.Environment.Add(SystemContants.OwinMannatechClientInfo, cert.Subject);
else
{
context.Response.StatusCode = 403;
return;
}
}
else
{
context.Response.StatusCode = 403;
return;
}
// Exception certError;
if (context.Environment.Keys.Contains(OwinCertError))
{
//certError = context.Environment[OwinCertError] as Exception;
context.Response.StatusCode = 403;
return;
}
}
catch (Exception ex)
{
context.Response.StatusCode = 403;
return;
}
}
else
{
context.Response.StatusCode = 403;
return;
}
await Next.Invoke(context);
}
}
公共类CertificateAuthenticationMiddleware:OWIN中间件
{
conststring OwinCertFunc=“ssl.LoadClientCertAsync”;
conststring OwinCert=“ssl.ClientCertificate”;
conststring OwinCertError=“ssl.ClientCertificateErrors”;
公共证书身份验证中间件(OWIN中间件下一步):基础(下一步)
{}
///
///出于安全考虑,Invoke()方法从OWIN的启动类中调用。
///
///
///
公共异步重写任务调用(IOwinContext上下文)
{
if(context.Environment.Keys.Contains(OwinCertFunc))
{
尝试
{
var task=(context.Environment[OwinCertFunc]作为Func);
等待任务。运行(任务);
if(context.Environment.Keys.Contains(OwinCert))
{
var cert=context.Environment[OwinCert]asX509Certificate;
if(cert!=null)context.Request.Environment.Add(SystemContants.OwinMannatechClientInfo,cert.Subject);
其他的
{
context.Response.StatusCode=403;
返回;
}
}
其他的
{
context.Response.StatusCode=403;
返回;
}
//异常证书错误;
if(context.Environment.Keys.Contains(OwinCertError))
{
//certError=context.Environment[OwinCertError]作为异常;
context.Response.StatusCode=403;
返回;
}
}
捕获(例外情况除外)
{
context.Response.StatusCode=403;
返回;
}
}
其他的
{
context.Response.StatusCode=403;
返回;
}
等待下一步。调用(上下文);
}
}
目前,我收到了403禁止的响应,这没有任何意义,因为我正在从客户端传递正确的证书。意识到我的中间件顺序错误。记住秩序 意识到我的中间件顺序错误。记住秩序