gpt4 book ai didi

使用 ASP.Net MVC/Web API 进行 PayPal 结帐 - token 身份验证问题

转载 作者:太空宇宙 更新时间:2023-11-03 16:09:09 27 4
gpt4 key购买 nike

我在 ASP.Net MVC5 网站上尝试通过 PayPal 接受付款。

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

我的问题是,一旦在 PayPal 中完成付款,用户必须再次登录。

我一直在用这个tutorial作为指南。我没有购物车,所以我忽略了教程的第一部分,直接转到集成 PayPal 部分(我没有看到任何我认为与身份验证问题相关的内容,但我可能是错的)。

ShortcutExpressCheckout 方法正确返回所需的 URL(和 token )。我使用以下内容构建返回 URL(子路径是 {controller}/{action}):

    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://{我的应用程序的登录页面}?ReturnUrl={subPath}%26token{token}

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

假设 IIS Express 不是问题,有谁知道如何在从 PayPal 返回时保留凭证?

更新:

这一定是我们软件的问题,因为我从教程中下载了源代码并运行它,它工作正常,即使使用 IIS Express(而且教程代码也有身份验证)。

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

当我一开始登录时,发送到 API 中 token 授权 Controller 的请求有一个如下所示的 token :

eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJpc3MiOiJNUCIsImF1ZCI6Imh0dHBzOi8vbG9jYWxob3N0OjQ0MzAxLyIsIm5iZiI6MTQwODQ5MzIwMCwiZXhwIjoxNDA4NTM 2NDAwLCJuYW1laWQiOiIxMjEzIiwiY2x1YmlkIjoiNTAwNTIiLCJtZW1iZXJpZCI6IjIiLCJhdXRobWV0aG9kIjoicmVzb3VyY2Vvd25lciIsImp0aSI6IjU3Yjc5Yjk2LTlhNzgtNGM5Yy 1hNDI2LWQ1OGZlYmM5OWJkNSJ9.rPPFyStZzwy0dRwczU2w4pzmRezgIsDX2VO9lArU15A

每个请求都传递这个 token 。

从 PayPal 返回时, token 如下所示:

EC-2JD43180AM571484F

而且,这个无效的 token 会导致以下异常。

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)

更新 2:

教程认证配置代码:

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

app.UseExternalSignInCookie(DefaultAuthenticationTypes.ExternalCookie);
app.UseGoogleAuthentication();
}

我们的身份验证配置:

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

app.UseTokenAuthentication(new TokenAuthenticationOptions());
}

他们使用外部 cookie,我们使用 token 身份验证。

更新 3:

好的,事实证明我们有一个 TokenAuthenticationHandler 类拦截请求并检查是否存在名为“token”的 URL 查询参数,并在检查请求 header 之前使用它进行身份验证。

所以我从声明主体中获取了 token ,并将其放入 PayPal 返回 URL 和一个查询参数中。

但是,我认为会收到一条异常消息:

The string needs to be in compact JSON format, which is of the form: '<Base64UrlEncodedHeader>.<Base64UrlEndcodedPayload>.<OPTIONAL, Base64UrlEncodedSignature>'.

有谁知道如何正确编码我的 token 以便将其用作查询参数?

最佳答案

写了一个继承AuthenticationHandlerTokenAuthenticationHandler类。

这让我能够拦截来自 PayPal 的重定向并从 URL 查询参数中提取 token 。

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

我已经发布了关于此的另一个问题 here .

关于使用 ASP.Net MVC/Web API 进行 PayPal 结帐 - token 身份验证问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25377589/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com