.Net-Core内置授权码流

时间:2019-01-22 01:56:46

标签: c# oauth .net-core authorization

我正在为我的应用程序简化登录过程。抢先使用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中有一些内置功能可以执行此请求并将令牌存储在用户管理器中。有谁知道这样做的内置方式?

2 个答案:

答案 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 ProvidersAdding 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>