如何在没有授权属性的情况下调用连接/授权

问题描述 投票:0回答:2

我在 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 中获取用户信息?

c# asp.net-core-mvc identityserver4
2个回答
2
投票

必须应用

Authorize
属性以填充
User
。时期。如果您不想实际限制访问,您还可以添加
AllowAnonymous
属性。通常,最好的方法是用
[Authorize]
装饰所有涉及用户的控制器,然后使用
[AllowAnonymous]
有选择地允许访问特定操作。


1
投票

添加授权然后使用 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 网站。

© www.soinside.com 2019 - 2024. All rights reserved.