C# 为角色提供程序轻松使用ASP.NET标识
我刚刚花了两天的时间用现有数据库研究并实现了新的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属性,并查看其角色。我如何让我的标识实现实现这一
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()
方法更容易。请看我上面的更新。您不必将用户强制转换为ClaimsPrincipalUser.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());
}
}