我已经发现几天ASP.NET Core,并想尝试通过LinkedIn实现身份验证。
我在网上找到的大多数教程都是使用MVC的,这是一个无缝的过程,但是我想做一个纯API。
我有一些有效的方法,但是我不确定这是安全的(我遇到了一些我以不安全的方式“解决”的问题)。
配置身份时,我使用,services.AddIdentityCore<ApplicationUser>()而不是AddIdentity<>避免添加cookie身份验证方案,然后使用service.AddAuthentication(...).AddJwtBearer(...)。
我使用电子邮件/密码进行了注册/登录,返回了JWT令牌,并使用它们来保护对API方法的访问,并且效果很好。
到目前为止,一切都很好。
我遇到的问题是当我.AddLinkedIn()(来自aspnet-contrib提供程序)出现的。
我添加了/login/external?provider=LinkedIn仅(?)作用是的路线
public IActionResult ExternalLogin(string provider)
{
return Challenge(provider);
}
Run Code Online (Sandbox Code Playgroud)
将用户重定向到提供程序登录页面。这是我所做的第一件事,我认为这可能是一个肮脏/不安全的修复程序,但是它可以起作用:我在LinkedIn登录页面上重定向,然后在我的回调页面上重定向(在本例中为/login/linkedin?code=)。
那是我不了解的事情发生的地方:AspNet.Security.OAuth.LinkedIn.LinkedInAuthenticationHandler可能基于回调路径被调用了,并验证了所有内容。它还尝试登录,但是由于我没有配置SignIn方案(JWT Bearer仅允许Authenticate和Challenge方案),所以该方法不起作用。
更糟糕的是,当AddIdentity<>我第一次尝试使用时,我得到了一个如下所示的回调循环:
info: Microsoft.AspNetCore.Hosting.Internal.WebHost[1]
Request starting HTTP/1.1 GET https://localhost:5001/login/external?provider=LinkedIn
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Route matched with {action = "ExternalLogin", controller = "Login"}. Executing action RestAPI.Controllers.LoginController.ExternalLogin (RestAPI)
info: Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker[1]
Executing action method RestAPI.Controllers.LoginController.ExternalLogin (RestAPI) with arguments (LinkedIn) - Validation state: …Run Code Online (Sandbox Code Playgroud) c# oauth-2.0 single-page-application asp.net-core asp.net-core-webapi