从 Web api MVC 中的身份验证令牌中提取用户详细信息

Extract User details from web api auth token in MVC

我正在使用一个 webapi 项目作为我的身份验证服务器和资源服务器。目的是从 Android 应用程序访问服务。我还想要一个用 MVC 应用程序编写的 Web 前端。我最初使用默认的 MVC 身份验证,但已转移到 web pai 分发令牌。我可以从 webapi 服务接收身份验证令牌,并且我将令牌发送到 cookie 中的客户端,尽管我可能只是在客户端缓存。我目前有以下 OAuthBearerAuthenticationProvider 运行:

public class CookieOAuthBearerProvider : OAuthBearerAuthenticationProvider
{
    public override Task RequestToken(OAuthRequestTokenContext context)
    {
        base.RequestToken(context);
        var value = context.Request.Cookies["AuthToken"];
        if (!string.IsNullOrEmpty(value))
        {
            context.Token = value;
        }
        return Task.FromResult<object>(null);
    }    
}

在我的启动中class我有这个方法:

private void ConfigureAuth(IAppBuilder app)
    {

        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
        {

            Provider = new CookieOAuthBearerProvider(),

        });
    }

这是我在配置方法中调用的。

我似乎缺少的一点是如何利用将我的令牌转换为登录用户。我似乎无法弄清楚反序列化发生在哪里。我尝试将 configueAuth 更改为:

private void ConfigureAuth(IAppBuilder app)
    {

        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
        {

            Provider = new CookieOAuthBearerProvider(),
            AccessTokenProvider = new AuthenticationTokenProvider()
            {

                OnReceive = receive
            }
        });
    }

    public static Action<AuthenticationTokenReceiveContext> receive = new Action<AuthenticationTokenReceiveContext>(c =>
    {
        c.DeserializeTicket(c.Token);
        c.OwinContext.Environment["Properties"] = c.Ticket.Properties;
    });

并且正在调用我的接收方法。 AuthenticationTokenReceiveContext 附加了我的令牌,但 DeserializeTicket 返回 null。谁能告诉我从这个令牌中获取用户详细信息所缺少的东西?

根据下面的建议答案进行更新。 Statrup 代码和 OAuthBearerAuthenticationOptions 现在像这样:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);
    }

    private void ConfigureAuth(IAppBuilder app)
    {

        OAuthOpt = new OAuthBearerAuthenticationOptions()
        {

            Provider = new CookieOAuthBearerProvider(),
            AccessTokenProvider = new AuthenticationTokenProvider()
            {

                OnReceive = receive
            }
        };
        app.UseOAuthBearerAuthentication(OAuthOpt);
    }

    public static Action<AuthenticationTokenReceiveContext> receive = new Action<AuthenticationTokenReceiveContext>(c =>
    {
        var ticket = OAuthOpt.AccessTokenFormat.Unprotect(c.Token);

    });

    public static OAuthBearerAuthenticationOptions OAuthOpt { get; private set; }
}

但我仍然得到一个空值。我可以在 OAuthBearerAuthenticationOptions 上遗漏一些相关选项吗?

试试这个。

将您正在实例化的 OAuthBearerAuthenticationOptions 内联保存到 Startup.Auth 中名为 OAuthOpt(或您喜欢的任何名称)的静态变量,并在您想要检索用户的任何地方使用下面的代码信息。

Microsoft.Owin.Security.AuthenticationTicket ticket = Startup.OAuthOpt.AccessTokenFormat.Unprotect(token);` 

我建议您使用 Json Web Tokens (JWT) 并使用 CustomOAuthProvider 自定义令牌生成。 Here is a good resource from Taiseer Joudeh on how to do this. You will have to use this nuget package 解码不记名令牌。