我正在制作自己的系统来在某些场景中验证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
以便放置断点,并且可以看到,当它被调用时,我的actionContext
与IsAuthorized == 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