ASP.NET Core with Blazor:无法确定 cookie 身份验证
ASP.NET Core with Blazor: Cannot figure out cookie authentification
我尝试按照本教程 (http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/4316/A-Demonstration-of-Simple-Server-side-Blazor-Cookie-Authentication.aspx) 进行操作,以便能够使用 ASP.NET Core 3.0 和 Blazor 框架 v.0.9.0(最新版本)制作带有 cookie 身份验证的应用程序。 IDE 我使用的是 VS 2019 预览版。
作者使用早期版本的 Blazor,但我按照教程使用客户端项目而不是应用程序,因为我认为它们做同样的事情,只是在不同版本的 Blazor 中调用不同。
这是一个 link 回购我的结果:https://github.com/SaintMSent/TestBlazorCookieAuth
问题是,它不起作用。如果我转到 localhost:port/login 页面,则会创建 cookie(我检查了 Chrome 开发工具)。如果我转到注销页面,它会被删除,所以这部分没问题。但是应用程序的其他页面不会加载。如果我从 MainLayout 中删除登录组件,一切都加载正常,所以我认为问题出在 Login.cshtml
中的 HttpContext 和 HttpContextAccessor
这是 Login.cshtml 的样子
@using System.Security.Claims
@using Microsoft.AspNetCore.Http
@page "/login"
@inject IHttpContextAccessor _httpContextAccessor
@inject HttpClient Http
@if (User.Identity.Name != null)
{
<b>You are logged in as: @User.Identity.Name</b>
<a class="ml-md-auto btn btn-primary"
href="/logout?returnUrl=/"
target="_top">Logout</a>
}
else
{
<a class="ml-md-auto btn btn-primary"
href="/login?returnUrl=/"
target="_top">Login</a>
}
@functions {
private ClaimsPrincipal User;
protected override void OnInit()
{
base.OnInit();
try
{
// Set the user to determine if they are logged in
User = _httpContextAccessor.HttpContext.User;
}
catch { }
}
}
请帮我弄清楚这里发生了什么。希望我提供了足够的细节,谢谢。
更新:如果我添加这一行
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
到客户端项目中的Startup.cs,一切都在加载,但_httpContextAccessor.HttpContext.User始终为空
我用奇怪的方法解决了。我创建了一个名为 AuthController 的控制器,并向其中添加了这些方法
[Route("api/[controller]")]
public class AuthController : Controller
{
[HttpGet]
[Route("getlogin")]
public string GetLogin()
{
if (User.Identity.IsAuthenticated)
{
return $"{User.Identity.Name}";
}
return string.Empty;
}
[HttpGet]
[Route("getrole")]
public string GetRole()
{
if (User.Identity.IsAuthenticated)
{
if (User.IsInRole("Admin"))
{
return "Admin";
}
return "User";
}
return string.Empty;
}
}
然后我从客户端调用 API,它非常适合我
我尝试按照本教程 (http://lightswitchhelpwebsite.com/Blog/tabid/61/EntryId/4316/A-Demonstration-of-Simple-Server-side-Blazor-Cookie-Authentication.aspx) 进行操作,以便能够使用 ASP.NET Core 3.0 和 Blazor 框架 v.0.9.0(最新版本)制作带有 cookie 身份验证的应用程序。 IDE 我使用的是 VS 2019 预览版。
作者使用早期版本的 Blazor,但我按照教程使用客户端项目而不是应用程序,因为我认为它们做同样的事情,只是在不同版本的 Blazor 中调用不同。
这是一个 link 回购我的结果:https://github.com/SaintMSent/TestBlazorCookieAuth
问题是,它不起作用。如果我转到 localhost:port/login 页面,则会创建 cookie(我检查了 Chrome 开发工具)。如果我转到注销页面,它会被删除,所以这部分没问题。但是应用程序的其他页面不会加载。如果我从 MainLayout 中删除登录组件,一切都加载正常,所以我认为问题出在 Login.cshtml
中的 HttpContext 和 HttpContextAccessor这是 Login.cshtml 的样子
@using System.Security.Claims
@using Microsoft.AspNetCore.Http
@page "/login"
@inject IHttpContextAccessor _httpContextAccessor
@inject HttpClient Http
@if (User.Identity.Name != null)
{
<b>You are logged in as: @User.Identity.Name</b>
<a class="ml-md-auto btn btn-primary"
href="/logout?returnUrl=/"
target="_top">Logout</a>
}
else
{
<a class="ml-md-auto btn btn-primary"
href="/login?returnUrl=/"
target="_top">Login</a>
}
@functions {
private ClaimsPrincipal User;
protected override void OnInit()
{
base.OnInit();
try
{
// Set the user to determine if they are logged in
User = _httpContextAccessor.HttpContext.User;
}
catch { }
}
}
请帮我弄清楚这里发生了什么。希望我提供了足够的细节,谢谢。
更新:如果我添加这一行
services.TryAddSingleton<IHttpContextAccessor, HttpContextAccessor>();
到客户端项目中的Startup.cs,一切都在加载,但_httpContextAccessor.HttpContext.User始终为空
我用奇怪的方法解决了。我创建了一个名为 AuthController 的控制器,并向其中添加了这些方法
[Route("api/[controller]")]
public class AuthController : Controller
{
[HttpGet]
[Route("getlogin")]
public string GetLogin()
{
if (User.Identity.IsAuthenticated)
{
return $"{User.Identity.Name}";
}
return string.Empty;
}
[HttpGet]
[Route("getrole")]
public string GetRole()
{
if (User.Identity.IsAuthenticated)
{
if (User.IsInRole("Admin"))
{
return "Admin";
}
return "User";
}
return string.Empty;
}
}
然后我从客户端调用 API,它非常适合我