Owin如何将AuthenticationTicket与经过身份验证的UserPrincipal相关联

时间:2018-04-03 13:25:20

标签: owin

所以,我为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的想法? (搜索我自己的应用程序代码,没有人这样做,只读不设置)

最诚挚的问候。

0 个答案:

没有答案