Blazor .NET Core 6 具有多种授权方案的强大支持,可以使用它们来对应用程序中的不同部分进行身份验证和授权。在这种情况下,我们需要使用 API 密钥对某些资源进行身份验证和授权,而对于其他资源,则需要使用传统的登录方式。
为了实现这一目标,我们首先需要在 appsettings.json 文件中定义 API 密钥:
"ApiKeys": {
"MyApiKey": "12345"
},
我们还需要定义一个自定义授权方案,其中包含对 API 密钥的验证:
services.AddAuthentication(options =>
{
options.DefaultScheme = CookieAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = "ApiKeyScheme";
})
.AddCookie() // add cookie auth
.AddApiKey(options =>
{
options.ApiKeyHeaderName = "apikey";
options.ApiKeys = Configuration.GetSection("ApiKeys").Get>();
});
然后,我们需要在应用程序中的指定部分使用授权方案。例如,在一个页面中,我们可以这样使用:
@attribute [Authorize(AuthenticationSchemes = "ApiKeyScheme,Cookies")]
如果请求中包含 API 密钥,则用户将被授权访问该页面。如果 API 密钥不存在,则用户将被重定向到登录页面。我们可以使用以下代码实现:
var authSchemes = new List() { "ApiKeyScheme", "Cookies" };
var authResults = await HttpContext.AuthenticateAsync(authSchemes);
if(authResults.Succeeded)
{
// User is authenticated
}
else
{
// Redirect to login page
NavigationManager.NavigateTo("/login");
}