asp.net – Web API外部承载未经授权
我试图从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(). (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- asp.net-mvc-3 – MVC 3不显眼的验证 – 有条件地禁用/启用
- 文件上传 – 在ASP.NET Core中使用Axios和Vue.JS进行多个文
- .net – DataContract Serializer数组节点名称’d3p1′
- asp.net – Web发布的密码不同于我的Azure管理员密码?
- asp.net-mvc-4 – 如何在Durandal中使用cshtml文件?
- ASP.NET MVC与Web客户端软件工厂(WCSF)
- asp.net-web-api2 – 在控制器操作中获取JSON Web Token有效
- 有没有办法以编程方式设置ASP.NET Universal Providers的连
- 在asp.net中使用cookie mvc c#
- asp.net – K运行时使用的.Net完整框架和.Net Core Framewo