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 帐户工作流程。
我该怎么做?
保留身份数据库给我带来了一些好处:
- 我计划向数据库中添加更多数据 - 如果我可以引用同一数据库中存在的帐户,那将非常方便
- 我可能需要授予没有 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"];
});
我想要 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 帐户工作流程。
我该怎么做?
保留身份数据库给我带来了一些好处:
- 我计划向数据库中添加更多数据 - 如果我可以引用同一数据库中存在的帐户,那将非常方便
- 我可能需要授予没有 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"];
});