我正在为我的应用程序简化登录过程。抢先使用IdentityServer进行登录,但是我不需要整个令牌服务器,因此我现在正在降级以仅使用Asp.Net Identity。
在此之前,我曾经能够通过第三方登录:
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
// Request a redirect to the external login provider.
var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
这使我可以登录(Coinbase)等第三方,但是我对它的工作方式感到困惑,因为我看不到他们接收授权码的地方。
我已经从我的oauth提供者那里获得了授权码,现在我需要获取访问令牌。我可以通过手动发出请求来轻松做到这一点,例如
POST /oauth/token HTTP/1.1
Host: authorization-server.com
grant_type=authorization_code
&code=xxxxxxxxxxx
&redirect_uri=https://example-app.com/redirect
&client_id=xxxxxxxxxx
&client_secret=xxxxxxxxxx
但是我觉得.net中有一些内置功能可以执行此请求并将令牌存储在用户管理器中。有谁知道这样做的内置方式?
答案 0 :(得分:1)
即使您不需要服务器,我还是建议坚持使用Identity Server Nuget软件包进行客户端身份验证。
它提供了您要使用的功能来处理各种OATH流,因此您不必自己实现它们。
否则,您将必须在客户端,服务器端应用程序和要进行身份验证的服务之间手动请求。根据您的需要,可以获得quite complex。
使用Nuget包,您可以使用OpenID Connect(无论是Coinbase还是其他服务)通过依赖注入通过几行代码连接外部身份验证提供程序。
从那里可以handle the callback and sign the user in。
有关更多信息,请查看官方Identity Server文档中的Sign-in with External Identity Providers和Adding Support for External Authentication页面。
默认情况下,Asp.Net身份将处理本地终结点“ / account / ExternalLogin”下的回叫。如果需要自定义功能,请从基本RCL中you can scaffold that page进行自定义。
答案 1 :(得分:0)
结果证明我正在思考问题。我可以使用在Identity Server中配置的相同OAuth Provider,并将它们移植到我的.Net-Core Project,然后可以使用相同的登录方法
[HttpPost]
[AllowAnonymous]
public IActionResult ExternalLogin(string provider, string returnUrl = null)
{
// Request a redirect to the external login provider.
var redirectUrl = Url.Action(nameof(ExternalLoginCallback), "Account", new { returnUrl });
var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
return Challenge(properties, provider);
}
要挑战我唯一需要做的事情,就是提供一种可以调用我的外部登录方法的表格:
<form #form method="post" class="form-horizontal" action="https://localhost:44370/Account/ExternalLogin">
<div>
<p>
<button ion-button block [disabled]="isDisabled" (click)="form.submit()" type="submit" title="Log in using your Coinbase account">
Coinbase
</button>
<input type="hidden" name="provider" value="Coinbase">
</p>
</div>
</form>