如何从Owin中间件正确登录用户



我正在制作自己的系统来在某些场景中验证jwt令牌。

当我正确验证了令牌时,我就有了

var userIdentity = await user.CreateIdentityAsync(DefaultAuthenticationTypes.ExternalBearer);
owinContext.Authentication.User = new System.Security.Claims.ClaimsPrincipal(userIdentity);
owinContext.Authentication.SignIn(userIdentity);
System.Web.HttpContext.Current.User = owinContext.Authentication.User;
await next()

但这似乎并不能解决在Asp.NetMvc级别仍然失败的身份验证问题。因为我知道它使用HttpContext,所以我尝试在调用next()之前添加它

HttpContext.Current.User = new GenericPrincipal(userIdentity, new string[0]);

这让我走得更远,但我似乎仍然收到了一个授权错误,它似乎来自Web Api[Authorize]属性(通过搜索我收到的消息的来源和使用位置)。

我在追踪.net源代码方面遇到了困难。我应该得到这个消息的唯一方法是如果IsAuthorized返回false。但是,既没有指定角色,也没有指定用户(只是简单的[Authorize]),在转到next()之前,我可以停止调试器,并检查是否有用户标识,是否有IsAuthorized

我已经重写了AuthorizeAttribute以便放置断点,并且可以看到,当它被调用时,我的actionContextIsAuthorized == false的身份完全不同。这反过来又让我怀疑我是否在错误的中登录了用户身份

所以我这样做对吗?我该怎么办?

我从未低估过原因,但在我的情况下,我需要在登录后有效:

var userIdentity = await user.CreateIdentityAsync(DefaultAuthenticationTypes.ExternalBearer);
ctx.Authentication.SignIn(userIdentity);
AuthenticationTicket ticket = new AuthenticationTicket(userIdentity, null);
ctx.Validated(ticket);

编辑

我真的不在同一个背景下。在我的案例中,我有一个自定义身份验证提供程序继承了Microsoft.Owin.Security.OAuth.OAuthBearerAuthenticationProvider:

public class CustomBearerAuthenticationProvider:OAuthBearerAuthenticationProvider
{
public CustomBearerAuthenticationProvider() : base()
{
this.OnValidateIdentity = (context) => Task.Run(() =>
{
var identity = this.CreateApplicationIdentity(user);
context.OwinContext.Authentication.SignIn(identity);
AuthenticationTicket ticket = new AuthenticationTicket(identity, null);
context.Validated(ticket);
});
}
}

context的类型为:Microsoft.Owin.Security.OAuth.OAuthValidateIdentityContext

相关内容

  • 没有找到相关文章

最新更新