【问题标题】:Using ASP.NET Identity for a Role Provider easily轻松为角色提供者使用 ASP.NET 标识
【发布时间】:2014-01-31 00:31:13
【问题描述】:

过去两天我刚刚用我现有的数据库研究和实现了新的 ASP.NET 身份系统。更多信息在这里:Integrating ASP.NET Identity into Existing DbContext

现在,我有一个可以工作的 UserStoreRoleStore,但我似乎无法弄清楚如何在我的 ASP.NET MVC 5 应用程序中利用它们,而无需编写看起来像大量代码的代码让我感到困惑的身份样本。

我想要实现两件事:1) 使用 cookie 来维护授权;2) 使用角色来限制应用程序在视图和控制器中呈现的内容的访问。

为了能够使用那些我显然需要使用代表授权用户的Controller.User 属性并查看它的角色。如何让我的 Identity 实现实现这一目标?

最后,在身份示例中,我看到他们正在使用 OWIN,我有点明白,但它似乎是一种超级迂回的方式,我仍然不知道如何正确实施。就索赔而言,它们让我感到困惑的程度是我理解它们的两倍。

如果有任何正确方向的指示,我将不胜感激。

【问题讨论】:

    标签: c# asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity


    【解决方案1】:

    回到这个问题后,我想我找到了一个简单有效的解决方案。我最终为 OWIN 创建了一个启动配置类。据我了解,因为 OWIN 是一个中间件,它会拦截请求,计算出身份验证(如果有),并更新 Controller 类的 User 属性,其中 UserClaimsIdentity 类的实例。

    之后,其他一切都可以正常使用,就像您通常使用 ASP.NET 的 User 属性一样。我确实使用名为UserId 的额外属性扩展了我的基本控制器,该属性解析User 属性以获取数据库中使用的实际ID。我的意图是让我可以使用 Id 来查询我的DbContext 使用的真正的Employee 类。我们会看看它是否会保留,与此同时,这是我的StartupConfiguration 的代码:

    public sealed class StartupConfig {
        public void Configuration(
            IAppBuilder app) {
            this.ConfigureAuthentication(app);
        }
    
        public void ConfigureAuthentication(
            IAppBuilder app) {
            app.UseCookieAuthentication(new CookieAuthenticationOptions {
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                LoginPath = new PathString("/"),
                ExpireTimeSpan = new TimeSpan(0, 60, 0)
            });
        }
    }
    

    这是我配置 UserId 属性的方式:

    protected int UserId {
        get {
            return Convert.ToInt32(base.User.Identity.GetUserId());
        }
    }
    

    别忘了用[assembly: OwinStartupAttribute(typeof(namespace.StartupConfig))] 装饰班级。希望这对某人有所帮助。

    【讨论】:

    • “我确实用一个名为 UserId 的额外属性扩展了我的基本控制器,它解析 User 属性以获取数据库中使用的实际 Id”——你知道,OWIN 有一个名为 GetUserId 的 IIdentity 扩展方法为您从用户声明主体中获取此信息,无需基本控制器来执行此操作...
    • 是的,我确实使用它,但我更容易在控制器中调用 base.UserId,根据需要传递它,而不是不断重写代码以将 User 转换为ClaimsPrincipal 并在我可能需要的任何地方调用 GetUserId() 方法。请看我上面的更新。
    • 您不必将 User 强制转换为 ClaimsPrincipal。 User.Identity.GetUserId() 会起作用。扩展方法在 IIdentity 上,因此它与 IPrincipal 无关。我知道你对 int 强制转换的意思,但我们有一个单独的扩展方法。他们应该使该方法通用...
    • Welp,我学到了一些东西。在我实施 OWIN 的时候,我一定很困惑(我认为这是在黑暗中的一次尝试,但最终还是奏效了)。我将其更新为return Convert.ToInt32(base.User.Identity.GetUserId());。而且,是的,你是对的,它应该是通用的。我暂时保留UserId 属性。我们会看看它是否持续存在,还没有深入到需要它的项目中。感谢您让我知道演员阵容毫无意义。
    • 一点也不。如果您有 ReSharper,那您也可以使用它。尽量不要在你的应用程序和 MVC 控制器之间放置一个基本控制器,它最终会带来比其价值更多的麻烦,而且几乎总是可以避免的。
    【解决方案2】:

    您是否记得将您的应用程序名称放在您的网络配置中?

    <roleManager enabled="true">
       <providers>
          <clear />
            <add connectionStringName="ApplicationServices" 
                 name="AspNetSqlRoleProvider"       
                 type="System.Web.Security.SqlRoleProvider" 
                 applicationName="DONT FORGET THIS PART" />
        </providers>
    </roleManager>       
    

    在您的控制器中使用以下选项之一。

    [Authorize] //Anyone with authorization
    [Authorize(Roles="Administrator")] //Admin role only
    

    你也可以这样做。

    HttpContext.User.IsInRole("Administrator")
    UserManager.IsInRole(userID, "Administrator")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-08
      • 1970-01-01
      • 2011-07-08
      • 2023-03-18
      • 2023-03-14
      • 1970-01-01
      • 2011-02-17
      • 1970-01-01
      相关资源
      最近更新 更多