gpt4 book ai didi

asp.net - Web API 外部承载未经授权

转载 作者:行者123 更新时间:2023-12-01 05:10:47 25 4
gpt4 key购买 nike

从 facebook 检索 token 后,我尝试调用 Web API 中的 RegisterExternal 方法。但我的 Web API 不断收到 401 Unauthorized 错误。我不确定我是否正确实现了逻辑流程。我的代码是;

询问支持的外部登录提供商;

    public async Task<List<ExternalLoginViewModel>> GetExternalLoginsAsync()
{
using (var client = GetNewHttpClient(false))
{
var response = await client.GetAsync("api/account/externalLogins?returnUrl=/&generateState=true");

response.EnsureSuccessStatusCode();

return await response.Content.ReadAsAsync<List<ExternalLoginViewModel>>();
}
}

由此,我返回了一个 Facebook URL。我按照这个操作,然后输入我的 Facebook 用户名和密码。我通过深层链接返回到我的应用程序,然后尝试像这样调用 Web API 中的 RegisterExternal 方法,并传递返回的 facebook“访问 token ”。

    public async Task<bool> SendSubmitRegisterExternalAsync(RegisterExternalBindingModel ro, string accessToken)
{
using (var client = GetNewHttpClient(true))
{
client.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", accessToken));

HttpResponseMessage response = await client.PostAsJsonAsync("api/Account/RegisterExternal", ro);
if (response.IsSuccessStatusCode) return true;

var value = await response.Content.ReadAsStringAsync();
throw new ResponseErrorException(ErrorHelper.GetErrorString(value));
}
}

我每次都会收到“未经授权”。我不知道出了什么问题。我的 Web API 方法如下所示,并且该类标有 [Authorize] 属性。

    [OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[Route("RegisterExternal")]
public async Task<IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model)
{
...

今晚我发现了三个不同的帖子,人们问了完全相同的问题,而且在所有情况下都没有回复,所以我不抱希望,但如果有人能对此有所了解,那就太好了!

编辑:我还将方法签名更改为“allowanonymous”,但仍然未经授权!

    [OverrideAuthentication]
[HostAuthentication(DefaultAuthenticationTypes.ExternalBearer)]
[AllowAnonymous]
[Route("RegisterExternal")]
public async Task<IHttpActionResult> RegisterExternal(RegisterExternalBindingModel model)
{

最佳答案

我通过不使用 FacebookSessionClient 而是通过 WebBrowser 控件来完成此操作。

我使用第一步中的 URL(由 WebAPI 提供给我)。然后,在 WebBrowser 控件的 Navigated 事件中,我解析访问 token 的 Url;

    public async void ParseUrlForAccessToken(string url)
{
string fieldName = "access_token";
int accessTokenIndex = url.IndexOf(fieldName, StringComparison.Ordinal);

if (accessTokenIndex > -1)
{
int ampersandTokenIndex = url.IndexOf("&", accessTokenIndex, StringComparison.Ordinal);
string tokenField = url.Substring(accessTokenIndex, ampersandTokenIndex - accessTokenIndex);
string token = tokenField.Substring(fieldName.Length);

token = token.Remove(0, 1);

await _dataService.SubmitLoginExternal("Test", token);

}
}

然后如上所示,我调用 SubmitLoginExternal,这是对以下代码的调用,该代码使用从 WebBrowser 控件 Url 检索的访问 token 来注册帐户(在本例中为“测试”帐户);

        using (var client = GetNewHttpClient(true))
{
client.DefaultRequestHeaders.Add("Authorization", String.Format("Bearer {0}", accessToken));

HttpResponseMessage response = await client.PostAsJsonAsync("api/Account/RegisterExternal", ro);
if (response.IsSuccessStatusCode) return true;

var value = await response.Content.ReadAsStringAsync();
throw new ResponseErrorException(ErrorHelper.GetErrorString(value));
}

这已经成功了,现在我已经在我的数据库中注册了该用户。

关键是使用 WebBrowser 控件,而不是 FacebookSessionClient 对象或 WebBrowserTask。您不能使用 WebBrowserTask,因为在页面加载后您需要 Hook 导航事件以调用 ParseUrlForAccessToken()。

关于asp.net - Web API 外部承载未经授权,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25223132/

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