繁体   English   中英

从MVC中的web api auth令牌中提取用户详细信息

[英]Extract User details from web api auth token in MVC

我使用webapi项目作为我的auth服务器和资源服务器。 目的是访问服务形式的Android应用程序。 我还想要一个用MVC应用程序编写的Web前端。 我最初使用的是默认的MVC auth,但已经转移到web pai发放令牌。 我可以从webapi服务接收auth令牌,我将令牌发送到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(),

        });
    }

我在Configuration方法中调用它。

我似乎缺少的是如何将我的令牌转换为登录用户。 我似乎无法弄清楚deserializtion发生在哪里。 我尝试将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你实例化内嵌到名为静态变量OAuthOpt (或任何你喜欢) Startup.Auth何地,你想获取用户信息使用下面的代码。

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

我建议你使用Json Web Tokens (JWT)并使用CustomOAuthProvider自定义令牌生成。 以下是Taiseer Joudeh关于如何做到这一点的好资源。 您将不得不使用此nuget包来解码承载令牌。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM