- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我可以使用 this library 在 .NET Core 1 中配置 Instagram 身份验证,但我似乎无法让它在 .NET Core 2 中工作。
似乎没有任何与 .NET Core 2.0 兼容的 Instagram OAuth 库,因此我尝试使用内置的 AddOAuth 方法。我能够毫无问题地对所有内容进行身份验证,但由于某种原因,LinkLoginCallback 中的 GetExternalLoginInfoAsync 方法始终返回 null。由于所有这些事情都发生在 AspNetCore.Authentication 中,我假设我的设置和配置不正确(或缺少某些关键内容),或者此解决方案由于其他原因而无法工作。
我在ConfigureServices中的配置如下所示:
services.AddAuthentication().AddOAuth("Instagram", "Instagram", options =>
{
options.ClientId = "MYID";
options.ClientSecret = "MYSECRET";
options.AuthorizationEndpoint = "https://api.instagram.com/oauth/authorize/";
options.CallbackPath = "/signin-instagram";
options.TokenEndpoint = "https://api.instagram.com/oauth/access_token";
options.Scope.Add("basic");
options.ClaimsIssuer = "Instagram";
options.UserInformationEndpoint = "https://api.instagram.com/v1/users/self";
});
有人能够在 .NET Core 2.0 中成功通过 Instagram 进行身份验证吗?任何帮助将不胜感激!
最佳答案
不是专门针对 Instagram,但我使用与上面类似的设置为 Twitch 进行了自定义 OAuth 验证。
我从 GetExternalLoginInfoAsync 中收到了相同的 Null 错误,并且我必须执行许多步骤才能使其正常工作。
最后,我通过查看此处找到的 GetExternalLoginInfoAsync 方法的源代码发现了问题 - Microsoft.AspNetCore.Identity.SignInManager.cs
我发现的第一件事实际上是在方法的第一行
var auth = await Context.AuthenticateAsync(IdentityConstants.ExternalScheme);
该方法设置为始终使用ExternalScheme常量,因此如果您在 Startup.cs 中设置自定义 SignInScheme调用此方法时不会使用它。将 SignInScheme 设置为默认值似乎也不适合我。
LoginProviderKey 为空。
if (auth?.Principal == null || items==null||!items.ContainsKey(LoginProviderKey)){return null;}
修复上述问题后,我发现没有设置任何声明,因此我也必须手动设置。我在另一个 Stackoverflow 问题上找到了一个这样的例子 - AddOAuth linkedin dotnet core 2.0
请参阅下面我的最终代码:
Startup.cs 配置 OAuth 中间件
在启动中,我将 SignInScheme 设置为使用 IdentityConstants.ExternalScheme 值,并在 OnCreatingTicket 中添加客户声明设置事件。
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddOAuth("Twitch", "Twitch", o =>
{
o.SignInScheme = IdentityConstants.ExternalScheme;
o.ClientId = "MY CLIENT ID";
o.ClientSecret = "MY CLIENT SECRET";
o.CallbackPath = "/signin-twitch";
o.ClaimsIssuer = "Twitch";
o.AuthorizationEndpoint = "https://api.twitch.tv/kraken/oauth2/authorize";
o.TokenEndpoint = "https://api.twitch.tv/api/oauth2/token";
o.UserInformationEndpoint = "https://api.twitch.tv/helix/users";
o.Scope.Add("openid");
o.Scope.Add("user:read:email");
o.Events = new Microsoft.AspNetCore.Authentication.OAuth.OAuthEvents
{
OnCreatingTicket = async context =>
{
var request = new HttpRequestMessage(HttpMethod.Get, context.Options.UserInformationEndpoint);
request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", context.AccessToken);
request.Headers.Add("x-li-format", "json");
var response = await context.Backchannel.SendAsync(request, context.HttpContext.RequestAborted);
response.EnsureSuccessStatusCode();
var user = JObject.Parse(await response.Content.ReadAsStringAsync());
var data = user.SelectToken("data")[0];
var userId = (string)data["id"];
if (!string.IsNullOrEmpty(userId))
{
context.Identity.AddClaim(new Claim(ClaimTypes.NameIdentifier, userId, ClaimValueTypes.String, context.Options.ClaimsIssuer));
}
var formattedName = (string)data["display_name"];
if (!string.IsNullOrEmpty(formattedName))
{
context.Identity.AddClaim(new Claim(ClaimTypes.Name, formattedName, ClaimValueTypes.String, context.Options.ClaimsIssuer));
}
var email = (string)data["email"];
if (!string.IsNullOrEmpty(email))
{
context.Identity.AddClaim(new Claim(ClaimTypes.Email, email, ClaimValueTypes.String,
context.Options.ClaimsIssuer));
}
var pictureUrl = (string)data["profile_image_url"];
if (!string.IsNullOrEmpty(pictureUrl))
{
context.Identity.AddClaim(new Claim("profile-picture", pictureUrl, ClaimValueTypes.String,
context.Options.ClaimsIssuer));
}
}
};
});
AccountController.cs 创建挑战
当我们发出挑战时,我们还必须包含 LoginProvider 值。
public IActionResult LoginWithTwich(string returnUrl = null)
{
var authProperties = _signInManager.ConfigureExternalAuthenticationProperties("Twitch", returnUrl);
return Challenge(authProperties, "Twitch");
}
AccountController.cs 处理回调
最后,当我们处理回调时,GetExternalLoginInfoAsync 方法不再返回 null。
public async Task<IActionResult> ExternalLoginCallback(string returnUrl = null)
{
ExternalLoginInfo info = await _signInManager.GetExternalLoginInfoAsync();
//to sign the user in if there's a local account associated to the login provider
var result = await _signInManager.ExternalLoginSignInAsync(info.LoginProvider, info.ProviderKey, isPersistent: false);
if (!result.Succeeded)
{
return RedirectToAction("ConfirmTwitchLogin", new { ReturnUrl = returnUrl });
}
if (string.IsNullOrEmpty(returnUrl))
{
return Redirect("~/");
}
else
{
return RedirectToLocal(returnUrl);
}
}
关于c# - Instagram OAuth GetExternalLoginInfoAsync 在 .NET Core 2.0 中始终返回 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46158462/
我有访问 AuthenticationManager 的私有(private)属性: private IAuthenticationManager AuthenticationManager => H
ExternalLoginInfo loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); 为什么这一行必须总是返回
我创建了一个新的 MVC5 Web 应用程序,当我按照官方指南尝试使用 Google 登录时 http://www.asp.net/mvc/overview/security/create-an-as
我结合使用 IdentityServer4 和 ASP .NET Core Identity 来创建联合登录页面。我正在使用的外部提供商之一是通过 Open ID Connect 协议(protoco
当我第一次尝试使用外部提供者登录时返回 null 然后我在提供者中再次按下,一切都很好。我认为是 cookie 的问题,因为当我删除所有 cookie 并重试时会发生错误。 如果我删除所有 Sessi
任何人都可以帮助阐明 Live SDK (v5.6) 的实现与 Microsoft.AspNet.Identity.Owin.dll 中发生的事情吗? 通过以下方式验证成功后返回的用户id: //MV
var loginInfo = await AuthenticationManager.GetExternalLoginInfoAsync(); if (loginInfo == null) {
我一直在尝试使用 Google 帐户在 MVC5 应用程序中使用 OWIN 实现外部登录。 如果我已经登录到 google,单击我的应用程序中的 google 按钮就可以了,它会在允许我访问登录信息后
我创建了一个新的 MVC5 Web 应用程序,当我尝试使用 Google 或 Facebook 登录时,调用了 AccountController 中的 ExternalLoginCallback 操
我使用 Strava 作为我的外部登录提供商(我假设这与 Strava 无关,也可能是 google 或 facebook)运行几个小时/天甚至几周后 GetExternalLoginInfoAsyn
更新我的 MVC5 应用程序的 nuget 包后(到目前为止一直正常工作)用于验证我的用户 Facebook 登录的身份验证管理器现在总是返回 null。 我正在 visual studio 2012
我有 ASP.NET 5 项目,我正在使用 Web API 建立外部登录(用于 Facebook 和 Google)。就我而言,我有包含以下代码的 Web API Controller (不是 MVC
OWIN 身份验证有问题。当我尝试使用 Facebook 或 Google 登录时,我总是从 GetExternalLoginInfoAsync() 收到空值。 但是有一些神秘的情况。当我打开 Fid
我正在尝试在 Visual Studio 2013 的新 MVC 5 项目中设置集成的 OWIN WS-Federation (ADFS) 身份验证。 Startup.Auth 中的 WsFedera
我正在尝试使用 dot-net core 2.0 设置 Facebook 身份验证,但在我的ExternalLoginCallbackAsync 方法中,我总是得到 null 作为响应,我已遵循文档,
这个问题已经有答案了: ASP.NET_SessionId + OWIN Cookies do not send to browser (9 个回答) 已关闭5 个月前。 我使用默认的 Visual
我可以使用 this library 在 .NET Core 1 中配置 Instagram 身份验证,但我似乎无法让它在 .NET Core 2 中工作。 似乎没有任何与 .NET Core 2.0
我已经尝试了几乎所有可用的在线解决方案,但仍然无法获得有效的解决方案。我使用 GoogleAuthentication 使用 dotnetcore 3 web API 进行 POC。 我已将 cons
为什么 signinmanager getexternallogininfoasync 方法总是返回 null? 我将 VS2015 与默认的 asp.net 核心(不是框架)项目一起用于具有个人用户
我正在将 SustainSys.Saml2 与 Gluu 服务器集成为我的 IdP。我正在使用开箱即用的脚手架身份页面。当我在 localhost 中运行并查看控制台日志时,一切似乎都可以与 SAML
我是一名优秀的程序员,十分优秀!