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

时间:2019-07-23 15:17:33

标签: c# asp.net-core-mvc identityserver4

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

2 个答案:

答案 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网站。