gpt4 book ai didi

c# - ASP.Net Core 2.1 中间件 WindowsPrincipal ClaimsPrincipal

转载 作者:行者123 更新时间:2023-12-05 04:01:29 26 4
gpt4 key购买 nike

情况:我有一个(仅限内部网)网站,它使用用户名/密码登录。也可以使用windows用户登录。

我做什么:当用户转到此站点上的页面并且尚未使用用户名/密码登录时,用户将使用 Windows 身份验证登录。这导致他的 HttpContext.User对象类型 WindowsPrincipal .然后我通过 SignInManager<User>.SignInAsync() 自动将用户登录到他相应的用户。 .现在用户拥有我的数据库中指定的所有角色,而不是 AD 给定的角色。

当前方法的问题:最初我只在默认起始页进行重写。因此,我可以在部分登录后显式地重新加载此页面。如果用户改为转到不同的子页面(例如通过书签),则将跳过身份验证类型的重写 => 他保持 WindowsPrincipal .

我的解决方案尝试:通过中间件完成登录部分。我有一项服务(它实现了 IMiddleware,比较 https://stackoverflow.com/a/52214120/2968106 ),它在其 InvokeAsync() 方法中执行此操作。

我的解决方案有问题:使用我的中间件以用户身份登录发生得太晚了,因此相关页面返回“拒绝访问”,因为此时用户缺少所需的角色.再次加载页面可以解决此问题。我在 Configure 中调用了中间件Startup.cs的方法|在 app.UseAuthentication() 之后和 app.UseSession() .将它移到这两个之前不会改变任何东西。

问题:a)这种做法是否可行; b) 我应该在什么时候调用它,或者是否有一种方法可以在登录完成后从中间件内部重新请求所有参数完整的给定页面?

关于 b):是否有某种函数可以从头开始重新启动管道,我可以在 SignInAsync() 之后在我的中间件中调用它?

编辑:

1) 我的中间件

public class WindowsPrincipalToClaimPrincipal :IMiddleware
{
private readonly SignInManager<User> _signInManager;
private readonly UserService _userService;
public WindowsPrincipalToClaimPrincipal(SignInManager<User> signInManager, UserService userService)
{
_signInManager = signInManager;
_userService = userService;
}

public Task InvokeAsync(HttpContext context, RequestDelegate next)
{
if (context.User is WindowsPrincipal)
{
_signInManager.SignInAsync(_userService.GetCurrentUser(), false).Wait();
}
return next(context);
}
}

2) Startup.cs的相关部分

//At the end of ConfigureServices()
services.AddScoped<WindowsPrincipalToClaimPrincipal>();

//Inside Configure(), before app.UseMvc(...);
app.UseAuthentication();
app.UseSession();
app.UseMiddleware<WindowsPrincipalToClaimPrincipal>(); //moving this line to the beginning of Configure() doesn't change anything.

最佳答案

看起来答案比预期的要容易。如果这在所有情况下都能按预期工作,我将不得不更详细地尝试,但在短期内,我发现了以下可能的解决方案:

在中间件中,在 SignInAsync() 之后添加以下行:

context.User = _signInManager.CreateUserPrincipalAsync(_userService.GetCurrentUser()).Result;

我已经习惯了用户是只读的(就像当你使用 PageModel.User 时),我什至没有想到写入该属性的可能性。

编辑:另一个要点:不要过早调用中间件。它应该在 app.useAuthentication() 之后调用,否则您将无法使用普通帐户登录。

关于c# - ASP.Net Core 2.1 中间件 WindowsPrincipal ClaimsPrincipal,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55357838/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com