所以,我为owin制作了一个简单的基本auth中间件。中间件返回一个AuthenticationTicket,其中包含用户主体声明,身份验证类型(" Basic")yada yada。
protected override Task<AuthenticationTicket> AuthenticateCoreAsync()
{
....
var claimsIdentity = TryGetPrincipalFromBasicCredentials(token, Options.CredentialValidationFunction);
....
var ticket = new AuthenticationTicket(claimsIdentity, new AuthenticationProperties(){userName = claimsIdentity.name});
return Task.FromResult(ticket);
}
要获取声明,我使用硬编码值进行测试:
var claims = new List<Claim>();
claims.Add(new Claim(KneatClaimTypes.Permission, Permission.UserAdministrationView.ToString()));
var claimsIdentity = new ClaimsIdentity(
new GenericIdentity("Administrator", "Basic"),
claims
);
return claimsIdentity;
我使用与IdentityModel相同的架构使用简单的扩展来挂钩owin https://github.com/IdentityModel/IdentityModel.Owin.BasicAuthentication
app.UseBasicAuthentication(new BasicAuthOptions("Realm",
(username, password, context) => BasicAuthCredentialCheck.Authenticate(username, password, context))
{
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = "Basic"
});
我为故障单创建了正确的主体,但是在owin解析了身份验证之后,没有填充Thread.currentPrincipal。如果我添加一个简单的cookie auth,每当我调用Owin.Authentication.SignIn(...)
时,它都会为我创建一个Principal。如果我手动设置Thread.currentPrincipal,那么就有了解决方法。
我不太了解owin如何在引擎盖下工作,我试图从中获取源并开始阅读它可能会弄清楚。但万一我没有,任何关于谁可以重置这个Thread.currentPrincipal的想法? (搜索我自己的应用程序代码,没有人这样做,只读不设置)
最诚挚的问候。