ASP.NET 核心 - 使用外部提供者但*保留*默认身份数据库

ASP.NET Core - use external provider but *keep* Default Identity database

我想要 ASP.NET Core 中默认身份提供程序附带的数据库。但是,我希望用户只使用他们的 Microsoft 帐户登录。

所以目前,我的用户 LoginDisplay.razor 文件中有这个:

<AuthorizeView>
    <Authorized>
        <a href="Identity/Account/Manage">Hello, @context.User.Identity.Name!</a>
        <a href="Identity/Account/LogOut">Log out</a>
    </Authorized>
    <NotAuthorized>
        <a href="Identity/Account/Register">Register</a>
        <a href="Identity/Account/Login">Log in</a>
    </NotAuthorized>
</AuthorizeView>

当用户点击 "Log in" 时,他们将被带到常规登录表单:

他们可以在此处单击 "Microsoft Account" 按钮。我想做的是跳过默认登录屏幕并直接转到 Microsoft 帐户工作流程。

我该怎么做?

保留身份数据库给我带来了一些好处:

更新

根据反馈,我实施了以下措施:

@inject Data.Services.AntiForgery antiforgery;

<form id="external-account" method="post" class="inline-block form-horizontal" action="/Identity/Account/ExternalLogin?returnUrl=%2F">
    <button type="submit" name="provider" value="microsoft" title="Log in using your Microsoft Account account">Login</button>
    <input name="__RequestVerificationToken" type="hidden" value="@antiforgery.Generate()">
</form>

这是我用来解决防伪请求令牌(在 Blazor 中)的实用程序 class:

public class AntiForgery
{
    public IAntiforgery Antiforgery { get; private set; }
    public IHttpContextAccessor Accessor { get; private set; }

    public AntiForgery( IAntiforgery antiforgery, IHttpContextAccessor accessor )
    {
        Antiforgery = antiforgery;
        Accessor = accessor;
    }

    public string Generate()
    {
        // Code stolen from:
        // *  and
        // * 
        return Antiforgery.GetAndStoreTokens( Accessor.HttpContext ).RequestToken;
    }
}

为了使实用程序 class 正常工作,我的启动文件中添加了以下内容:

services.AddSingleton<AntiForgery>();
services.AddHttpContextAccessor();

好吧,您可以简单地隐藏登录表单本身,只显示 Microsoft Account 按钮。但是,无法将用户直接发送到该流中。它需要一个初始 post,这将需要用户执行操作,即单击按钮。

物有所值。如果您有 "Login" 类型 link,您可以使用与 Microsoft Account 按钮相同的方式对其进行编码,以便在用户单击 "Login" 时启动流程。但是,您仍然需要一个实际的登录页面来重定向到授权失败,并且仍然需要在那里按下一个明确的按钮。

您可以使用 asp-route-provider 将提供商名称 Microsoft 直接传递给您的外部登录函数。

对于 asp.net 核心 2.2+,Identity 使用 Razor Pages 搭建到标识区域。

1.Login link.

<a asp-area="Identity" asp-page="/Account/ExternalLogin" asp-page-handler="TestExternal" asp-route-provider="Microsoft">Log in</a>

2.ExternalLogin.cshtml.cs

public IActionResult OnGetTestExternalAsync(string provider, string returnUrl = null)
    {
        var redirectUrl = Url.Page("./ExternalLogin", pageHandler: "Callback", values: new { returnUrl });
        var properties = _signInManager.ConfigureExternalAuthenticationProperties(provider, redirectUrl);
        return new ChallengeResult(provider, properties);
    }

3.Startup.cs

services.AddAuthentication().AddMicrosoftAccount(microsoftOptions =>
{
    //use your own Id and secret
    microsoftOptions.ClientId = Configuration["Authentication:Microsoft:ClientId"];
    microsoftOptions.ClientSecret = Configuration["Authentication:Microsoft:ClientSecret"];
});