2009-11-14 121 views
1

当用户已经登录但未处于正确角色时,如何将我的授权(角色=“blah”)令牌设置为重定向到“您无权执行此操作”?目前它重定向到登录页面,这不是我们所追求的。我们觉得用户在他们已经登录时被重定向到这个页面是令人困惑的。但是,如果他们没有登录,它应该重定向到登录页面。当用户已经登录时,如何重定向到非授权页面而不是登录页面?

回答

4

AuthorizeAttribute的设计方式是先查看用户是否已通过身份验证,然后查看他是否在角色中。如果任何这些条件不满足,它将返回返回HttpUnauthorizedResult,这反过来将响应代码设置为401.为了实现你想要的,你将需要实现你自己的IAuthorizationFiler

1

您的登录页面可以检查用户是否已通过身份验证(HttpContext.User.Identity.IsAuthenticated),然后重定向到其他页面。

或者,对于经过身份验证的用户(隐藏登录表单并改为显示相应的消息)进行不同的呈现。

+0

似乎有很多重定向发生在这里。首先,控制器属性(授权)检查用户是否已登录,如果是,则传递给角色提供者以查看用户是否被授权或将用户传递回登录页面。如果登录页面检测到用户已经登录,那么它会重新将它们重定向到未经授权的页面,这看起来像是一个混乱。我想我会更喜欢在IAuthorizationFilter中处理这个问题,以避免重定向。它看起来更清洁,更易于阅读。 – BobTheBuilder 2009-11-14 15:51:14

+0

“我认为我更喜欢在IAuthorizationFilter中处理这个问题” - 每个都是他自己的,但我认为重定向是更简单的解决方案。如前所述,您可以通过让登录页面呈现不同的登录用户来避免第二次重定向。 – Joe 2009-11-14 16:05:10

1

你应该看看Kazi Manzur Ra​​shid关于定制授权提供者的博客帖子:http://weblogs.asp.net/rashid/archive/2009/09/06/asp-net-mvc-and-authorization-and-monkey-patching.aspx。它可以是一个相当复杂的野兽,正确做到这一点。所以可以归结为几种选择,两种相当简单的做法是“错误的”,一种是相当复杂的做法“正确”。你的来电。无论哪种方式 - 这是值得阅读的博客文章。

0

AuthorizeAttribute的设计方式是先查看用户是否已通过身份验证,然后查看他是否在角色中。如果任何这些条件不满足,它将简单地返回一个HttpUnauthorizedResult,这反过来会将响应代码设置为401.

要达到您想要的效果,您需要实现自己的IAuthorizationFiler

+0

你当然应该熟悉接口。 – ALIRA 2015-10-04 14:38:56

相关问题