使用ASP.NETMVC/WebAPI进行PayPal签出-令牌身份验证问题

使用ASP.NETMVC/WebAPI进行PayPal签出-令牌身份验证问题,paypal,asp.net-web-api,asp.net-mvc-5,paypal-sandbox,Paypal,Asp.net Web Api,Asp.net Mvc 5,Paypal Sandbox,我有一个ASP.NETMVC5网站,我试图通过贝宝接受付款 用户案例是成员登录并查看其帐户。如果他们有未付余额,则单击“付款”按钮,进入接受金额的页面。在此页面上提交表单会将他们重定向到PayPal沙盒环境以完成付款 我的问题是,一旦支付在贝宝完成,用户必须再次登录 我一直以此为指导。我没有购物车,所以我忽略了教程的第一部分,直接转到集成PayPal部分。我没有看到任何我认为与认证问题相关的内容,但我可能错了 ShortcutExpressCheckout方法正确返回所需的URL和令牌。我使用以

我有一个ASP.NETMVC5网站,我试图通过贝宝接受付款

用户案例是成员登录并查看其帐户。如果他们有未付余额,则单击“付款”按钮,进入接受金额的页面。在此页面上提交表单会将他们重定向到PayPal沙盒环境以完成付款

我的问题是,一旦支付在贝宝完成,用户必须再次登录

我一直以此为指导。我没有购物车,所以我忽略了教程的第一部分,直接转到集成PayPal部分。我没有看到任何我认为与认证问题相关的内容,但我可能错了

ShortcutExpressCheckout方法正确返回所需的URL和令牌。我使用以下子路径{controller}/{action}构建返回URL:

    private string GetAbsolulteUrl(string subPath)
    {
        var appPath = string.Format("{0}://{1}{2}", Request.Url.Scheme, Request.Url.Authority, Url.Content("~"));
        var baseUri = new Uri(appPath);
        var uri = new Uri(baseUri, subPath);

        return uri.AbsoluteUri;
    }
然后我使用Response.Redirect,它会转到PayPal

支付完成后,浏览器的URL将重定向到:

http://{my app的登录页}?返回URL={subPath}%26token{token}

我不知道是否发生了此问题,因为我正在使用IIS Express进行开发。也就是说,IIS Express在重定向到PayPal时是否会丢弃所有会话信息

假设IIS Express不是问题所在,有人知道从PayPal返回时如何保留凭据吗

更新:

这一定与我们的软件有关,因为我从教程下载了源代码并运行了它,它工作得很好,即使使用IIS Express,教程代码也具有身份验证功能

我们有两个网站;MVC Razor网站和处理身份验证的Web API网站

当我开始登录时,发送到API中令牌授权控制器的请求中有一个令牌,如下所示:

6.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2.2在2.2 2 2 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 8 815A

每个请求都会传递此令牌

从PayPal返回时,令牌如下所示:

EC-2JD43180AM571484F

并且,此无效令牌会导致以下异常

System.ArgumentException was caught
  HResult=-2147024809
  Message=Jwt10204: 'System.IdentityModel.Tokens.JwtSecurityTokenHandler' cannot read this string: 'EC-2R2454574X846761Y'.
The string needs to be in compact JSON format, which is of the form: '<Base64UrlEncodedHeader>.<Base64UrlEndcodedPayload>.<OPTIONAL, Base64UrlEncodedSignature>'.
  Source=System.IdentityModel.Tokens.Jwt
  StackTrace:
       at System.IdentityModel.Tokens.JwtSecurityTokenHandler.ReadToken(String jwtEncodedString)
       at {our namespace}.Providers.JwtTokenServiceProvider.GetToken(String value)
       at {our namespace}.TokenAuthorisationController.Post(TokenRequest request)
我们的身份验证配置:

    public void ConfigureAuth(IAppBuilder app)
    {
        app.UseCookieAuthentication(new CookieAuthenticationOptions
        {
            AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
            LoginPath = new PathString("/Account/Login")
        });

        app.UseTokenAuthentication(new TokenAuthenticationOptions());
    }
他们使用外部cookie,我们使用令牌身份验证

更新3:

好的,事实证明我们有一个TokenAuthenticationHandler类截取请求并检查URL查询参数token是否存在,并在检查请求头之前将其用于身份验证

所以我从claims principal中获取了令牌,并将其放入PayPal返回URL和一个查询参数中

然而,我认为得到的是一条异常消息,它说:

The string needs to be in compact JSON format, which is of the form: '<Base64UrlEncodedHeader>.<Base64UrlEndcodedPayload>.<OPTIONAL, Base64UrlEncodedSignature>'.
有人知道如何正确编码我的令牌,以便将其用作查询参数吗?

编写了一个继承AuthenticationHandler的TokenAuthenticationHandler类

这使我能够截获来自PayPal的重定向,并从URL查询参数中提取令牌

我仍然遇到同样的异常,但现在需要解决的是JSON格式/URL编码


我已经发布了另一个问题。

您的mvc应用程序使用哪种身份验证?asp.net身份?非统组织?另外,当您被重定向回应用程序时,请确保检查您是否仍有身份验证cookie。您的返回url是否转到另一个子域?例如,从www.mydomain.com改为mydomain.com?我在帖子中添加了一个关于身份验证的更新,不,我不认为有子域更改。我做了一点进一步,现在有一个编码问题
The string needs to be in compact JSON format, which is of the form: '<Base64UrlEncodedHeader>.<Base64UrlEndcodedPayload>.<OPTIONAL, Base64UrlEncodedSignature>'.