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

C# 从MVC中的web api身份验证令牌提取用户详细信息,c#,asp.net,asp.net-mvc,asp.net-web-api,oauth-2.0,C#,Asp.net,Asp.net Mvc,Asp.net Web Api,Oauth 2.0,我使用webapi项目作为身份验证服务器和资源服务器。其目的是通过Android应用程序访问服务。我还想要一个正在MVC应用程序中编写的web前端。我最初使用默认的MVC身份验证,但现在已经转向web pai分发令牌。我可以从webapi服务接收auth令牌,并将令牌发送到cookie中的客户端,尽管我可能只是缓存客户端。我当前正在运行以下OAuthBeareAuthenticationProvider: public class CookieOAuthBearerProvider : OAut

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

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);
    }    
}
我在配置方法中调用它

我似乎缺少的一点是如何将我的令牌转换为登录用户。我似乎不知道反序列化发生在哪里。我已尝试将我的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;
    });
private void ConfigureAuth(IAppBuilder应用程序)
{
app.useAuthBeareAuthentication(新的OAuthBeareAuthenticationOptions()
{
Provider=新CookieOAuthBearProvider(),
AccessTokenProvider=新的AuthenticationTokenProvider()
{
OnReceive=接收
}
});
}
公共静态操作接收=新操作(c=>
{
c、 反序列化(c.Token);
c、 OwinContext.Environment[“Properties”]=c.Ticket.Properties;
});
正在调用我的receive方法。AuthenticationTokenReceiveContext已附加我的令牌,但DeserializeTicket返回null。有人能告诉我从这个令牌中获取用户详细信息缺少什么吗

根据下面的建议答案进行更新。Statrup代码和OAuthBeareAuthenticationOptions现在如下所示:

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; }
}
公共类启动
{
公共无效配置(IAppBuilder应用程序)
{
ConfigureAuth(app);
RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
}
专用void配置身份验证(IAppBuilder应用程序)
{
OAuthOpt=新的OAuthBeareAuthenticationOptions()
{
Provider=新CookieOAuthBearProvider(),
AccessTokenProvider=新的AuthenticationTokenProvider()
{
OnReceive=接收
}
};
应用程序使用OAuthBeareAuthentication(OAuthOpt);
}
公共静态操作接收=新操作(c=>
{
var ticket=OAuthOpt.AccessTokenFormat.Unprotect(c.Token);
});
公共静态OAuthBeareAuthenticationOptions OAuthOpt{get;private set;}
}
但我仍然得到一个空值。我可能缺少OAuthBeareAuthenticationOptions上的一些相关选项吗?

试试这个

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

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

我建议您使用
Json Web令牌(JWT)
并使用
CustomOAuthProvider
自定义令牌生成。在如何做到这一点上,Taiseer Joudeh提供了一个很好的资源。您必须使用此选项来解码承载令牌。

我没有在Startup Auth中使用OAuthorizationServerOptions。我没有使用过烘焙的东西,因为我想学习如何从头开始添加它。目前我只设置了UseAuthBeareAuthentication,因为我不需要在MVC应用程序中生成令牌。我是否需要先设置OAuthAuthorizationServerOptions,然后才能反序列化令牌?您好,我已经尝试过了,但输出值仍然为null。我已经用新代码更新了这个问题。也许我缺少OAuthBeareAuthenticationOptions设置中的一些相关选项?webApi和MVC应用程序都在同一台测试机器上运行,因此不要认为这是机器密钥反序列化问题。您的
receive
方法中
c.Token
的值是多少?它是web api项目中受保护的令牌值:T-ZM7z0VklZbg1aIDzM\U vD4\U QG3JRJn-GTQ8DWGZLJUYUTIEYXB\U PKQRV5YJIESP0C295ZC52ME795R4Q3DVTYIJJWIENTVOBX25SZ4I1JJSRTSYMJLYYBHSZYJ992PZRFGGS9GSFHTDWFY2ISGFI\U VEBQINSUWJJJJJJJUKNIZUKNIZUBJJJJUBJUBJUBJUPBROBPIORAIYT-Z\U BlobVPCru\U RTL74IVBBBBXDZDFZDZDZDZZZDZZHO\J6FRE6FRE6FRE3。您是否正在尝试从MVC客户端应用程序中反序列化令牌?
Microsoft.Owin.Security.AuthenticationTicket ticket = Startup.OAuthOpt.AccessTokenFormat.Unprotect(token);`