首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在MVC5中手动检查url授权?

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

Stack Overflow用户
提问于 2016-11-18 08:10:52
回答 3查看 2.2K关注 0票数 11

IIS-Manager

为了限制对web应用程序的访问,管理员可以通过IIS-Manager设置用户和组的url授权:

Web.config

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

代码语言:javascript
复制
<security>
  <authorization bypassLoginPages="true"> 
    <remove users="*" roles="" verbs="" />
    <add accessType="Allow" users="Testuser" />
    <add accessType="Deny" users="*" /> 
  </authorization>
</security>

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

代码语言:javascript
复制
<authentication mode="Forms">
  <forms [...] loginUrl="~/Auth/Login" [...] >
    [...]
  </forms>
</authentication>

MVC5应用程序:

用户必须通过他的Windows SamAccountName和密码通过自定义登录页面登录。凭据将发送给AuthControllerAuthController操作。

代码语言:javascript
复制
[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]属性自动进行授权检查:

代码语言:javascript
复制
[Authorize]
public class MainController : Controller
{
    [...]
}

[Authorize(Users="User1,User2")]这样的装饰并不是解决方案,因为代码不能被终端用户访问,而终端用户应该有可能配置对应用程序的访问。

当用户未被授权时,他将被重定向到登录页面。效果很好。但我需要在Login操作之前进行授权检查。所以我的问题是:

如果登录用户被授权重定向到AuthController,如何在MainController中手动验证

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-11-22 13:18:31

Q:,如果登录用户被授权重定向到MainController,如何在AuthController中手动验证?

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

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

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

Q:属性中的定义不能解决这个问题。管理员在购买软件时如何限制用户和组?您没有权限访问代码。

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

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

Note

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

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

票数 6
EN

Stack Overflow用户

发布于 2016-11-22 16:44:27

两种选择,

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

代码语言:javascript
复制
 [Authorize(Roles="TestUsers,Admins")]

然后将应该允许访问此操作的用户添加到这些角色中。角色作为ASP标识使用的ClaimsPrincipal的一部分提供。

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

票数 4
EN

Stack Overflow用户

发布于 2016-11-22 13:37:10

您不应该在<authorization> MVC中使用标记。是用于ASP.Net Web Form的。您可以在所以中阅读更多内容。

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

它没有几个片段,所以我在GitHub AspNetMvcActiveDirectoryOwin中创建了一个示例项目。最初的源是使用AD进行身份验证,但您只需调整ActiveDirectoryService类即可。

以下三门是主要的课程-

  1. AccountController
  2. ActiveDirectoryService
  3. OwinAuthenticationService取代FormsAuthentication。
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40672170

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档