在某些情况下,我正在制作自己的系统来认证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.Net Mvc级别。因为我知道它使用HttpContext
,所以我尝试在调用next()
HttpContext.Current.User = new GenericPrincipal(userIdentity, new string[0]);
这使我更进一步,但是我似乎仍会收到授权错误,该错误似乎是(通过在源中搜索我收到的消息和where its used)是来自Web API {{1} }属性。
我在追踪.net源代码方面碰壁。我应该收到此消息的唯一方法是如果IsAuthorized返回false。但是没有指定角色或用户(只是简单的[Authorize]
),在转到[Authorize]
之前,我可以停止调试器并检查是否存在用户身份,是{{1 }}。
我已经重写了next()
以便放置断点,并且可以看到到调用它时,我的IsAuthorized
与AuthorizeAttribute
的身份完全不同。这又使我想知道我是否在错误地登录用户身份
所以... am 我正确地做到了吗?我该怎么办?
答案 0 :(得分:2)
我从不了解为什么,但是就我而言,我需要在登录后验证票证
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