我在 IdentityServer4 上有两个 Asp.Net Core MVC 应用程序和登录系统。 第一个应用程序受到完全保护,意味着所有控制器都在 [Authorize] 属性后面,并且可以正常工作。 第二个应用程序是公共应用程序,没有任何 [授权] 属性。
问题在第二个应用上线
@if (User.Identity.IsAuthenticated)
{
<a href="#">@User.Identity.Name</a>
}
因为 User.Identity.IsAuthenticated 始终为假。 这段代码位于从简单操作调用的剃须刀页面上
public IActionResult Index()
{
return View();
}
我发现当我在此操作上添加 [Authorize] 属性时,会调用 IDS4“连接/授权”endpath 并且 User.Identity.IsAuthenticated 已通过身份验证并且一切正常。
问题是动作应该没有 [Authorize] 属性,我只想在用户登录时显示用户名和/或用户电子邮件。
有没有其他方法可以验证 cookie 并在 User.Identity 中获取用户信息?
您必须应用
Authorize
属性以填充User
。时期。如果您不想实际限制访问,您还可以添加 AllowAnonymous
属性。通常,最好的方法是用[Authorize]
装饰所有涉及用户的控制器,然后使用[AllowAnonymous]
有选择地允许访问特定操作。
添加授权然后使用 AllowAnonymous 属性将其关闭不会触发身份验证。用户必须至少被挑战一次。因为只有这样才会创建一个 cookie,并且一旦创建它就会在每个请求中发送,即使它是可匿名访问的。
在我的例子中,我有一个公共应用程序,其中的登录按钮只不过是挑战身份验证,然后将用户返回到它所在的页面。
public class HomeController : Controller
{
// available for any user
public IActionResult Index()
{
// false for anonymous, true for authenticated users
// also without the Authorize attribute.
var isAuthenticated = User.Identity.IsAuthenticated;
return View();
}
[Authorize]
public IActionResult Login(string returnUrl)
{
return LocalRedirect(returnUrl);
}
}
像在其他站点上一样,将登录链接添加到调用登录方法的菜单中。但在这种情况下,这是唯一需要用户登录的方法,假设您没有授权过滤器或其他授权属性。如果用户确实在 IdentityServer 上登录,那么将自动创建 cookie,除非 prompt=login。
在 Startup 中配置 cookies,像这样:
services
.AddAuthentication(options =>
{
options.DefaultScheme = "Cookies";
options.DefaultChallengeScheme = "oidc";
})
.AddCookie("Cookies", options =>
{
options.Cookie.Name = ".MySite.Cookie";
})
.AddOpenIdConnect("oidc", "Open Id connect", options =>
{
options.SignInScheme = "Cookies";
// etc
在点击登录链接之前,用户保持匿名。如果您将用户发送到该站点,则可以将其发送到登录链接。否则,由用户登录您的公共 mvc 网站。