如何手动检查MVC5中的网址授权?

时间:2016-11-18 08:10:53

标签: c# asp.net-mvc iis asp.net-mvc-5 authorization

IIS-管理器

要限制对Web应用程序的访问,管理员可以通过IIS管理器设置用户和组的URL授权:

IIS Autohrization Rules

的Web.config

IIS-Manager将授权规则存储在应用程序的web.config中:

<security>
  <authorization bypassLoginPages="true"> 
    <remove users="*" roles="" verbs="" />
    <add accessType="Allow" users="Testuser" />
    <add accessType="Deny" users="*" /> 
  </authorization>
</security>

bypassLoginPages设置为true时,所有用户都有权访问登录页面。当用户未登录时,他将自动被重定向到登录页面:

<authentication mode="Forms">
  <forms [...] loginUrl="~/Auth/Login" [...] >
    [...]
  </forms>
</authentication>

MVC5 App:

用户必须通过Windows SamAccountName和密码通过自定义登录页面登录。凭据将发送到Login的<{1}}操作:

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")]操作中进行授权检查。所以我的问题是:

如果登录用户有权重定向到Login,如何在我的AuthController中手动验证?

3 个答案:

答案 0 :(得分:6)

  

问:如果是登录用户,如何在我的AuthController中手动验证   有权重定向到MainController?

由于您使用的是Authorize属性,因此您无需在操作中手动检查授权。这些是一些规则:

  • 限制对经过身份验证的用户的访问权限:[Authorize]
  • 限制对特定用户的访问权限:[Authorize(Users="User1,User2")]
  • 限制对某些特定角色的访问权限:[Authorize(Roles="Administrators,PowerUsers")]

由于您使用MainController属性修饰了Authorize,这意味着没有人可以在没有登录的情况下访问其操作。 因此,在Logon操作中,您无需检查用户是否有权重定向到主控制器。这里没有任何安全漏洞,当您使用RedirectToAction("Index", "Main")时,您不必担心授权。

  

问: Authorize属性中的定义无法解决问题   问题。管理员如何限制用户和组   买软件?你无法访问代码。

为此类要求创建角色。您应该使用[Authorize(Roles="Role1")]以上MainController,然后Role1的每个用户都可以访问主控制器的操作。它可以简单地在您的应用程序的用户和角色管理中完成。所以:

  1. 在开发时,使用静态角色装饰控制器和操作
  2. 在运行时,您可以使用应用程序管理用户角色。
  3. 注意

    在大多数应用程序中,角色是静态的,您可以说哪个角色可以访问哪个操作。在这种情况下,当前Authorize属性足以授权。只需在运行时将用户添加到角色即可。 Identity Samples包含所需的模型,视图和控制器。

    如果要在运行时创建新角色或在运行时更改角色的权限,则需要创建一个新的Authorize属性,该属性从配置文件中读取用户角色或数据库以及从配置文件或数据库中读取角色的权限,并决定授权。

答案 1 :(得分:3)

您不应在ASP.Net MVC中使用<authorization>标记。 它适用于 ASP.Net Web表单 即可。您可以在SO中阅读更多内容。

在ASP.Net MVC中,您希望使用[Authorize]属性。此外,您希望使用 OWIN中间件 而不是旧的 FormsAuthenticationTicket

它很少,所以我在GitHub中创建了一个示例项目AspNetMvcActiveDirectoryOwin原始资源是通过AD进行身份验证,但您只需要调整ActiveDirectoryService类。

以下三个是主要类别 -

  1. AccountController

  2. ActiveDirectoryService

  3. OwinAuthenticationService取代FormsAuthentication。

答案 2 :(得分:3)

两个选项,

使用Authorize下的“角色”选项,如下所示:

 [Authorize(Roles="TestUsers,Admins")]

然后将应允许访问此操作的用户添加到这些角色。角色是ASP身份使用的ClaimsPrincipal的一部分。

或者,提供您自己的Authorize属性实现,该属性测试当前登录用户的任何业务规则,然后允许或禁止访问。