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

本文关键字:提取 用户 详细信息 令牌 身份验证 MVC 中的 Web API | 更新日期: 2023-09-27 18:37:15

我正在使用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);
    }    
}

在我的启动类中,我有这种方法:

private void ConfigureAuth(IAppBuilder app)
    {
        app.UseOAuthBearerAuthentication(new OAuthBearerAuthenticationOptions()
        {
            Provider = new CookieOAuthBearerProvider(),
        });
    }

我在配置方法中调用。

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

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上的一些相关选项?

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

试试这个。

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

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

我建议您利用Json Web Tokens (JWT)并使用CustomOAuthProvider自定义令牌生成。这是Taiseer Joudeh关于如何做到这一点的好资源。必须使用此 nuget 包来解码持有者令牌。