加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

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

发布时间:2020-12-16 09:40:44 所属栏目:asp.Net 来源:网络整理
导读:我试图从Facebook中检索一个令牌后,在Web API中调用RegisterExternal方法.但我一直从我的Web API获得401 Unauthorized.我不确定我是否正确实现了逻辑流程.我的代码是; 请求支持的外部登录提供商; public async TaskListExternalLoginViewModel GetExternalLo
我试图从Facebook中检索一个令牌后,在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“访问令牌”.

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事件中,我解析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检索的访问令牌来注册帐户(在本例中为“Test”帐户);

using (var client = GetNewHttpClient(true))
        {
            client.DefaultRequestHeaders.Add("Authorization",ro);
            if (response.IsSuccessStatusCode) return true;

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

这已经奏效了,现在我已经在我的数据库中注册了用户.

关键是使用WebBrowser控件而不是FacebookSessionClient对象或WebBrowserTask.您无法使用WebBrowserTask,因为您需要在页面加载后挂接到导航事件以调用ParseUrlForAccessToken().

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读