【问题标题】:asp.net mvc core - equivalent of User.IsSignedIn()asp.net mvc 核心 - 相当于 User.IsSignedIn()
【发布时间】:2016-02-29 06:30:44
【问题描述】:

我正在将 Web 应用程序迁移到新的 asp.net core 模型,但其中一个视图突然遇到障碍。

我在新模型下找不到与 User 和 User.IsSignedIn() 的迁移等效项 - 在视图中使用时,像这样...

@using System.Security.Claims
@if (User.IsSignedIn())
{
}

我已尝试导入 Microsoft.AspNetCore.Mvc.Razor 库,我认为它会保存在该库中,但它似乎无法以这种方式工作。

【问题讨论】:

    标签: asp.net-core


    【解决方案1】:

    查看迁移文档,我认为这可能会做到:

    @using System.Security.Principal
    
    @if (User.Identity.IsAuthenticated)
    { 
     ...
    }
    

    在这里找到:http://aspnetmvc.readthedocs.org/projects/mvc/en/latest/migration/migratingauthmembership.html

    【讨论】:

    • 确实如此!谢谢!
    【解决方案2】:

    ASP.NET 团队对 RC2 采用的方法是使用SignInManager.IsSignedIn:

    @using Microsoft.AspNetCore.Identity
    @using Mvc.Server.Models
    
    @inject SignInManager<ApplicationUser> SignInManager
    @inject UserManager<ApplicationUser> UserManager
    
    @if (SignInManager.IsSignedIn(User)) {
        <form asp-controller="Account" asp-action="LogOff" method="post" id="logoutForm" class="navbar-right">
            <ul class="nav navbar-nav navbar-right">
                <li>
                    <a asp-controller="Manage" asp-action="Index" title="Manage">Hello @UserManager.GetUserName(User)!</a>
                </li>
                <li>
                    <button type="submit" class="btn btn-link navbar-btn navbar-link">Log off</button>
                </li>
            </ul>
        </form>
    }
    else {
        <ul class="nav navbar-nav navbar-right">
            <li><a asp-controller="Account" asp-action="Register">Register</a></li>
            <li><a asp-controller="Account" asp-action="Login">Log in</a></li>
        </ul>
    }
    

    【讨论】:

    • User的价值从何而来?
    • 我试试这个,它说“用户”在当前上下文中不存在。
    • 这可能是因为您使用的是 RC2 包:VS 仍然依赖于 RC1 工具,并且无法访问基本视图页面类公开的属性。您可以放心地忽略此错误 ;)
    • 我觉得“安全地忽略错误”是 dot net core 的口头禅。 >:( - 我已经准备好更新工具了!!!
    • 值得注意的是,SignInManager 是 ASP.net 身份的一部分。如果您不使用身份,这将不起作用。
    【解决方案3】:

    实际上,早期的答案并不总是正确的,因为这取决于“登录”的含义。在 Core 中,IPrincipal 是 ClaimsPrincipal。虽然它具有类型为 ClaimsIdentity 的 Identity 属性,但它只是 Identities 属性集合中的第一个对象。这主要是为了向后兼容旧的 ASP.NET。在新世界中,没有一个身份必然比其他身份具有权威性……它们都是有效的。

    每个身份都有一个 IsAuthenticated 属性。例如,您可以拥有一个身份,该身份只是跟踪带有一些附加声明的匿名用户,因此无论创建身份如何,都可能将 IsAuthenticated 设置为 false。另一方面,当您调用登录方法时,Cookie 身份验证的管道将其设置为 true,但同样,这取决于您的应用程序的特定部分正在关注哪个身份。

    另外,在 RTM 版本中,没有 IsSignedIn。

    【讨论】:

    • Jeff 你检查过 MVC-Core 模板使用的SignInManager.IsSignedIn(User) (github.com/aspnet/Identity/blob/dev/src/…) 吗?看起来任何ApplicationCookieAuthenticationScheme 都被视为已登录。
    • 是的,我确实看到它现在存在。但请记住,这假设您希望依赖于 Identity 包。身份可以处理用户数据的所有管道和持久性,但如果您想扮演自己的角色,您只需要安全性。
    猜你喜欢
    • 2016-12-14
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2013-05-10
    • 1970-01-01
    • 1970-01-01
    • 2017-05-20
    • 1970-01-01
    相关资源
    最近更新 更多