ASP.NET MVC 表单身份验证 +授权属性+简单的角色
我正在尝试向 ASP.NET MVC 应用程序添加简单身份验证和授权。
我只是想在基本表单身份验证中添加一些附加功能(由于简单性和自定义数据库结构)
假设这是我的数据库结构: 用户: 用户名 密码 角色(最好是一些枚举。如果需要的话可以是字符串。目前,用户只有一个角色,但这可能会改变)
高级问题: 鉴于上述数据库结构,我希望能够执行以下操作:
- 使用表单身份验证进行简单登录 用
- 以下内容装饰我的操作: [Authorize(Roles={ MyRoles.Admin, MyRoles.Member})]
- 在我的视图中使用角色(以确定在某些部分中显示的链接)
目前,我真正确定的是如何进行身份验证。之后我就迷路了。我不确定在哪一点获取用户角色(登录、每次授权?)。由于我的角色可能不是字符串,因此我不确定它们如何与 User.IsInRole() 配合。
现在,我在这里问是因为我还没有找到一个“简单”的方法来完成我所需要的。我见过很多例子。
对于身份验证:
- 我们有简单的用户验证来检查数据库和“SetAuthCookie”
- ,或者我们覆盖会员提供程序并在 ValidateUser 内部执行此操作 在这两种情况下,我不确定如何添加我的简单用户角色,以便它们可以使用: HttpContext.Current.User.IsInRole("管理员") 此外,我不确定如何修改它以适应我的枚举值。
对于授权,我已经看到:
- 派生 AuthorizeAttribute 并实现 AuthorizeCore 或 OnAuthorization 来处理角色?
- 实施IPrincipal?
任何帮助将不胜感激。然而,我担心我可能需要很多细节,因为我在谷歌上搜索的内容似乎都不适合我需要做的事情。
I'm trying to add simple Authentication and Authorization to an ASP.NET MVC application.
I'm just trying to tack on some added functionality to the basic Forms Authentication (due to simplicity and custom database structure)
Assuming this is my database structure:
User:
username
password
role (ideally some enum. Strings if need be. Currently, user only has ONE role, but this might change)
High Level Problem:
Given the above database structure, I would like to be able to do the following:
- Simple Login using Forms Authentication
- Decorate my actions with:
[Authorize(Roles={ MyRoles.Admin, MyRoles.Member})] - Use roles in my Views (to determine links to display in some partials)
Currently, all I'm really sure of is how to Authenticate. After that I'm lost. I'm not sure at which point do I grab the user role (login, every authorization?). Since my roles may not be strings, I'm not sure how they will fit in with the User.IsInRole().
Now, I'm asking here because I haven't found a "simple" accomplish what I need. I have seen multiple examples.
For Authentication:
- We have simple user validation that checks the database and "SetAuthCookie"
- Or we override the Membership provider and do this inside of ValidateUser
In either of these, I'm not sure how to tack on my simple user Roles, so that they work with the:
HttpContext.Current.User.IsInRole("Administrator")
Furthermore, I'm not sure how to modify this to work with my enum values.
For Authorization, I've seen:
- Deriving AuthorizeAttribute and implementing AuthorizeCore OR OnAuthorization to handle roles?
- Implementing IPrincipal?
Any assistance would be greatly appreciated. However, I fear I may need a lot of detail, because none of what I've Googled seems to fit with what I need to do.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(5)
我想我已经实现了类似的东西。
我的解决方案基于 NerdDinner 教程,如下。
当您登录用户时,添加如下代码:
将以下代码添加到
Global.asax.cs
:完成此操作后,您可以使用
[授权]控制器操作代码中的
属性:如果您还有其他问题,请告诉我。
I think I've implemented something similar.
My solution, based on NerdDinner tutorial, is following.
When you sign the user in, add code like this:
Add following code to
Global.asax.cs
:After you've done this, you can use
[Authorize]
attribute in your controller action code:Please let me know if you have further questions.
构建一个可以使用枚举而不是字符串的自定义
AuthorizeAttribute
。当您需要授权时,通过附加枚举类型名称 + 枚举值将枚举转换为字符串,并使用其中的IsInRole
。要将角色添加到授权用户中,您需要附加到
HttpApplication
AuthenticateRequest
事件,类似于 http://www.eggheadcafe.com/articles/20020906.asp (但将大量嵌套的 if 语句反转为保护子句!)。您可以在表单身份验证 cookie 中往返用户角色或每次从数据库中获取它们。
Build a custom
AuthorizeAttribute
that can use your enums rather than strings. When you need to authorise, convert the enums into strings by appending the enum type name + the enum value and use theIsInRole
from there.To add roles into an authorised user you need to attach to the
HttpApplication
AuthenticateRequest
event something like the first code in http://www.eggheadcafe.com/articles/20020906.asp ( but invert the massively nested if statements into guard clauses!).You can round-trip the users roles in the forms auth cookie or grab them from the database each time.
我做了这样的事情:
将 [Authorize] 属性分配给您的控制器,您希望需要授权
或允许访问,例如 Login 和 ValidateUser 控制器使用以下属性
我的登录表单
从表单发布
验证用户是否通过 WCF 服务进行身份验证,该服务根据服务本地的 Windows AD 上下文进行验证,但您可以将其更改为您自己的身份验证机制
}
用户现在已通过身份验证,创建新的身份
在我的网站 _Layout.cshtml 顶部,我有类似这样的内容
然后在正文中
I did something like this:
Assign the [Authorize] attribute to your controllers, you want to require authorization for
or to allow access, for example the Login and ValidateUser controllers use the below attribute
My Login Form
Login Controller and ValidateUser controller invoked from the Form post
Validate user is authentication via a WCF service that validates against the Windows AD Context local to the service, but you can change this to your own authentication mechanism
}
User is authenticated now create the new Identity
On my site at the the top of my _Layout.cshtml I have something like this
Then in the body
将您的用户添加到“角色中的用户”表中。在代码中使用存储过程“addusertorole”(类似的东西)来添加各种角色。您可以在“角色”表中非常简单地创建角色。
要使用的表:User、UsersInRole、Roles
使用内置存储过程来操作这些表。然后您所要做的就是添加该属性。
例如,您可以在视图上拥有“Admin”属性,用于选择用户并将其添加到角色。您可以使用存储过程将该用户添加到角色中。
Add your users to the table "users in roles". Use the stored procedure "addusertorole" (something like that) in your code to add to various roles. You can create the roles very simply in the "roles" table.
Your tables to use: User, UsersInRole, Roles
Use the built in Stored Procs to manipulate those tables. Then all you have to do is add the attribute.
For example you can have an "Admin" attribute on a view that selects a user and adds them to a role. You can use the stored proc to add that user to the role.