我在IdentityServer4上有两个Asp.Net Core MVC应用程序和登录系统。 第一个应用程序受到了充分的保护,这意味着所有控制器都位于[Authorize]属性的后面,并且可以正常工作。 第二个应用是公共应用,没有任何[授权]属性。
问题在线上的第二个应用程序上
@if (User.Identity.IsAuthenticated)
{
<a href="#">@User.Identity.Name</a>
}
因为User.Identity.IsAuthenticated始终为false。 这段代码在剃刀页面上,通过简单的操作即可调用
public IActionResult Index()
{
return View();
}
我想出的是,当我在此操作上添加[Authorize]属性时,对IDS4'connect / authorize'终端路径和User.Identity.IsAuthenticated的调用已通过身份验证,并且一切正常。
问题是该操作应该没有[Authorize]属性,如果用户登录,我只想显示用户名和/或用户电子邮件。
还有其他方法可以验证Cookie并在User.Identity中获取用户信息吗?
答案 0 :(得分:0)
您必须必须应用Authorize
属性才能填充User
。期。如果您不想实际限制访问,也可以添加AllowAnonymous
属性。通常,最好的方法是用[Authorize]
装饰涉及用户的所有控制器,然后使用[AllowAnonymous]
有选择地允许访问特定操作。
答案 1 :(得分:0)
添加授权,然后使用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,除非提示= login。
在“启动”中配置cookie,如下所示:
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网站。