c# - 用户通过身份验证时,Razor 页面授权未加载页面
问题描述
我一直在尝试在我的 Razor 3.0 Web 应用程序中实现基本身份验证。
我有一个用户通过SignInAsync()登录,但是当尝试重定向到需要授权的页面时,该页面不会加载。而是重新加载登录页面,并更新 URL 并附加“ ?ReturnUrl=%Page%Path ”。
启动.cs
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages(options =>
{
options.Conventions.AuthorizeFolder("/Admin");
options.Conventions.AllowAnonymousToPage("/Login");
options.Conventions.AddPageRoute("/Login", "");
});
services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
.AddCookie();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseAuthentication();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
在这里,我将 Admin 文件夹设置为需要授权,并允许匿名用户访问登录页面。
登录.cshtml.cs
[BindProperty]
public UserModel UserLogin { get; set; }
public async Task<IActionResult> OnPost()
{
try
{
if (ModelState.IsValid)
{
var loginInfo = apiConnector.Get();
if (loginInfo)
{
await this.SignInUser(UserLogin.Username, false);
return this.RedirectToPage("/Admin/FormOverview");
}
}
}
catch(Exception e)
{
Console.Write(e);
}
return this.Page();
}
private async Task SignInUser(string username, bool isPersistant)
{
try
{
var claims = new List<Claim>() {
new Claim(ClaimTypes.Name, username)
};
var claimIdentities = new ClaimsIdentity(claims, CookieAuthenticationDefaults.AuthenticationScheme);
var claimPrincipal = new ClaimsPrincipal(claimIdentities);
var authProperties = new AuthenticationProperties
{
AllowRefresh = true,
IsPersistent = true,
};
await HttpContext.SignInAsync(CookieAuthenticationDefaults.AuthenticationScheme, claimPrincipal, authProperties);
}
在这里,我设置了一个始终返回 true 的虚拟 API,用户拥有声明创建它们并登录它们。
- 我已经尝试调试,我可以看到 User.Identity.IsAuthenticated 被正确设置为 true
- 当我从 Admin 文件夹中删除授权时,页面会正确重定向
- 登录后正在注册用户的声明
我是 Razor 的新手,所以我可能会错误地处理这个问题,感谢任何帮助,谢谢。
解决方案
订单事项
app.UseAuthentication();
app.UseAuthorization();
推荐阅读
- python - 尽管导入了 Flask,但仍获得“未解析的引用‘应用程序’”
- excel - 将模板从当前工作簿的工作表复制并粘贴到新工作簿的工作表
- git - Atlassian 的“git pull --rebase”教程图不正确吗?
- javascript - 在语义下拉菜单上触发多个事件
- react-native - 如何在 react-native 中导航到另一个堆栈?
- c++ - 在 C(也是 C++)中,'&' 运算符如何同时用作地址运算符和位运算符?由于 C 不支持运算符重载
- python - 带有q列表的多级列MultiIndex groupby对象上的熊猫分位数
- android - 如果片段实现了自定义接口,Dagger 会抛出错误
- java - 读取表中所做的更改并将它们复制到另一个系统
- jsp - JSP页面中如何获取和显示MultiMap对象属性的键和对应值