C# 如何在MVC5中手动检查url授权?
IIS管理器 要限制对web应用的访问,管理员可以通过IIS管理器设置用户和组的url授权: Web.config IIS管理器将授权规则存储在应用程序的web.config中:C# 如何在MVC5中手动检查url授权?,c#,asp.net-mvc,iis,asp.net-mvc-5,authorization,C#,Asp.net Mvc,Iis,Asp.net Mvc 5,Authorization,IIS管理器 要限制对web应用的访问,管理员可以通过IIS管理器设置用户和组的url授权: Web.config IIS管理器将授权规则存储在应用程序的web.config中: <security> <authorization bypassLoginPages="true"> <remove users="*" roles="" verbs="" /> <add accessType="Allow" users="Testus
<security>
<authorization bypassLoginPages="true">
<remove users="*" roles="" verbs="" />
<add accessType="Allow" users="Testuser" />
<add accessType="Deny" users="*" />
</authorization>
</security>
MVC5应用程序:
用户必须通过其Windows SamAccountName和密码通过自定义登录页面登录。凭证将被发送到AuthController
的登录
操作:
[AllowAnonymous]
public class AuthController : Controller
{
public ActionResult Login
{
// validation of SamAccountName and Password against Active Directory here.
[...]
// We want to check the authorization here.
// create authentication ticket
FormsAuthenticationTicket lFormsAuthenticationTicket = new FormsAuthenticationTicket(1,
SamAccountName,
DateTime.Now,
DateTime.Now.AddMinutes(AuthCookieTimeout),
RememberMe,
CustomData,
FormsAuthentication.FormsCookiePath);
// Encrypt the ticket.
string lEncryptedTicket = FormsAuthentication.Encrypt(lFormsAuthenticationTicket);
var lAuthCookie = new HttpCookie(FormsAuthentication.FormsCookieName, lEncryptedTicket);
// Create the cookie.
Response.Cookies.Add(lAuthCookie);
[...]
return RedirectToAction("Index", "Main"); // redirect to the main controller
}
}
所有受限控制器都通过[Authorize]
属性自动进行授权检查:
[Authorize]
public class MainController : Controller
{
[...]
}
像[Authorize(Users=“User1,User2”)]
这样的装饰不是解决方案,因为终端用户无法访问代码,而终端用户应该可以配置对应用程序的访问权限
当用户未经授权时,他将被重定向到登录页面。那很好。但是我需要先在登录
操作中进行授权检查。因此,我的问题是:
如果登录用户被授权重定向到MainController
,我如何在我的AuthController
中手动验证
Q:如果登录的用户
是否有权重定向到主控制器
因为您使用的是属性,所以不需要在操作中手动检查授权。以下是一些规则:
- 限制对已验证用户的访问:
[Authorize]
- 限制对某些特定用户的访问:
[授权(users=“User1,User2”)]
- 限制对某些特定角色的访问:
[授权(roles=“Administrators,PowerUsers”)]
Authorize
属性修饰了MainController
,这意味着没有登录,任何人都无法访问其操作。
因此,在登录操作中,您不需要检查用户是否有权重定向到主控制器。这里没有任何安全漏洞,使用RedirectToAction(“Index”,“Main”)
时不需要担心授权问题
Q:Authorize属性中的定义不会解决问题
问题管理员在访问用户和组时如何限制用户和组
购买软件?您的用户无法访问该代码
为此类需求创建角色。您应该在MainController
上面使用[Authorize(Roles=“Role1”)]
,然后Role1
的每个用户都可以访问主控制器的操作。它可以简单地在应用程序的用户和角色管理中完成。因此:
Authorize
属性就足以进行授权。只需在运行时将用户添加到角色。包含执行此操作所需的模型、视图和控制器
如果要在运行时创建新角色或在运行时更改角色的权限,您需要创建一个新的Authorize
属性,该属性从配置文件或数据库中读取用户角色,并从配置文件或数据库中读取角色权限,然后决定是否进行授权。您不应使用
在ASP.NETMVC中,您希望使用[Authorize]
属性。此外,您希望使用OWIN中间件而不是旧的表单身份验证票证
它只有几个部分,所以我在GitHub中创建了一个示例项目。最初的来源是通过AD进行身份验证,但您只需要调整ActiveDirectoryService类
以下三类为主要类别:
代替形式认证
两种选择
使用授权
下的“角色”选项,如下所示:
[Authorize(Roles="TestUsers,Admins")]
然后将应该允许访问此操作的用户添加到这些角色中。角色作为ASP Identity使用的ClaimsPrincipal
的一部分提供
或者,提供您自己的Authorize
属性实现,该属性测试当前登录的用户是否具有任何业务规则,然后允许或不允许访问。我不想使用标记???我想你不明白我的问题。我更新了我的问题。在ASP.Net MVC中使用
将导致您进入一个巨大的安全漏洞。该应用程序已经使用了[Authorize]属性。请阅读我的问题。您不应将
与[授权]
混为一谈。底线是不要在ASP.NETMVC中使用
标记。感谢某人为你付出时间,而不是投票否决他们,怎么样?你认为,Web应用程序的管理员(无权访问任何代码)应该在哪里定义有权访问Web应用程序的组和用户?由于您使用Authorize属性修饰MainController,这意味着没有登录,任何人都无法访问其操作→ 这是错误的。当用户登录(设置了FormsAuthenticationTicket)且未经授权(通过IIS管理器对用户和组进行url授权)时,则在调试模式下,[Authorized]声明的控制器第一行中的断点不会被触摸。但是当用户登录并获得授权后,他可以访问控制器。您没有获得它。1)如果您使用[Authorize]
没有登录,任何人都无法访问它。确定吗?→ 这意味着每个登录的用户都可以访问该操作。2)如果您使用[Authorize(Users=“User1,User2”)]
这意味着在登录的用户之间,只有User1和User2可以访问该操作。您不理解我的评论。
[Authorize(Roles="TestUsers,Admins")]