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

时间:2019-02-07 04:10:11

标签: asp.net-mvc asp.net-web-api asp.net-identity 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.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()以便放置断点,并且可以看到到调用它时,我的IsAuthorizedAuthorizeAttribute的身份完全不同。这又使我想知道我是否在错误地登录用户身份

所以... am 我正确地做到了吗?我该怎么办?

1 个答案:

答案 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