C# 如何在MVC5中手动检查url授权?

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

IIS管理器

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

Web.config

IIS管理器将授权规则存储在应用程序的web.config中:

<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")]