Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为角色提供程序轻松使用ASP.NET标识_C#_Asp.net_Asp.net Mvc_Asp.net Mvc 5_Asp.net Identity - Fatal编程技术网

C# 为角色提供程序轻松使用ASP.NET标识

C# 为角色提供程序轻松使用ASP.NET标识,c#,asp.net,asp.net-mvc,asp.net-mvc-5,asp.net-identity,C#,Asp.net,Asp.net Mvc,Asp.net Mvc 5,Asp.net Identity,我刚刚花了两天的时间用现有数据库研究并实现了新的ASP.NET身份识别系统。更多信息请点击此处: 现在,我有一个可用的UserStore和RoleStore,但我似乎不知道如何在我的ASP.NET MVC 5应用程序中利用它们,而不在所有让我困惑的身份示例中编写大量代码 我想实现两件事:1)使用cookie维护授权,2)使用角色限制应用程序在视图和控制器中呈现的内容的访问 为了能够使用这些,我显然需要使用代表授权用户的Controller.User属性,并查看其角色。我如何让我的标识实现实现这一

我刚刚花了两天的时间用现有数据库研究并实现了新的ASP.NET身份识别系统。更多信息请点击此处:

现在,我有一个可用的
UserStore
RoleStore
,但我似乎不知道如何在我的ASP.NET MVC 5应用程序中利用它们,而不在所有让我困惑的身份示例中编写大量代码

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

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

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


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

您是否记得在web配置中输入您的应用程序名称

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

你也可以这样做

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

回到这里,我想我找到了一个简单可行的解决方案。我最终为OWIN创建了一个启动配置类。据我所知,由于OWIN是一个中间件,它会截获请求,找出身份验证(如果有),并更新
控制器
类的
用户
属性,其中
用户
索赔实体
类的实例


在这之后,其他一切都会正常工作,就像您通常使用ASP.NET的
User
属性一样。我确实用一个名为
UserId
的额外属性扩展了我的基本控制器,该属性解析
User
属性以获取数据库中使用的实际Id。我这样做的目的是让Id可供我查询我的
DbContext
使用的真正
Employee
类。我们将看看这是否会持续,同时,以下是我的
启动配置的代码:

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的额外属性扩展了我的基本控制器,该属性解析用户属性以获取数据库中使用的实际Id”--您知道,OWIN有一个名为GetUserId的IIdentity扩展方法,它可以从用户声明主体中为您获取此信息,基本控制器不需要这样做……没错,我确实使用它,但对我来说,在控制器中调用
base.UserId
,根据需要传递它,比不断重写代码,将
User
转换为
ClaimsPrincipal
并在任何需要的地方调用
GetUserId()
方法更容易。请看我上面的更新。您不必将用户强制转换为ClaimsPrincipal
User.Identity.GetUserId()
将起作用。扩展方法是基于身份的,因此它是不可知论的。我知道你说的int casting是什么意思,我们有一个单独的扩展方法。他们应该让这种方法通用……嗯,我学到了一些东西。在我实现OWIN的时候,我一定很困惑(我认为这是一次冒险,但最终成功了)。我将其更新为
return Convert.ToInt32(base.User.Identity.GetUserId())。是的,你是对的,它应该是通用的。我暂时保留
UserId
属性。我们会看看它是否会持续下去,还没有深入到项目需要它的程度。谢谢你让我知道演员阵容毫无意义,一点也不。如果你有ReSharper,它也会帮你抓到的。尽量不要让一个基本控制器坐在你的应用程序和MVC控制器之间,这会带来很多麻烦,而且几乎总是可以避免的。
protected int UserId {
    get {
        return Convert.ToInt32(base.User.Identity.GetUserId());
    }
}