ASP.NET OWIN WebForms要求对所有页面进行授权

9
我使用Visual Studio 2013,Update 2创建了一个新的ASP.NET WebForms应用程序。然后,我更新了所有NuGet包,并删除了所有OAuth相关的内容,因为我只需要“表单”身份验证,这是我熟悉的。
我的目标是配置OWIN/ASP.NET Identity框架,以便所有页面都需要授权,包括默认页面 - 这样用户应该首先看到登录页面。正确的方法是什么?我无法在互联网上找到任何资源来展示如何使用OWIN/ASP.NET Identity保护WebForms页面。
我在主web.config文件底部添加了以下XML,但出现了错误:
<authorization>
  <deny users="?"/>
</authorization>

错误提示为:由于页面的相关配置数据无效,无法访问请求的页面。
3个回答

18

您是正确的,没有关于如何使用经典ASP.Net授权与OWIN安全中间件的资源。

我正在使用ASP.Net Web Pages,因此我的实验与您类似(我们都试图保护静态文件,即aspx或cshtml)。

我的实验非常可怕。我差点撞墙。

最后我发现了如何使它运行,这就是我所做的:

  1. Web.config:保护除了必须对匿名用户可用的特殊页面之外的所有内容。
<configuration>
    <system.web>
        <authorization>
            <deny users="?" />
        </authorization>
    </system.web>

    <location path="shell.cshtml">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>

    <location path="notFound.cshtml">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>

    <location path="security/login.cshtml">
        <system.web>
            <authorization>
                <allow users="*" />
            </authorization>
        </system.web>
    </location>
</configuration>
  1. OWIN启动类:
    public static class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            var cookieExpiration = TimeSpan.FromMinutes(20);

            app.UseCookieAuthentication(new CookieAuthenticationOptions
            {
                AuthenticationMode = AuthenticationMode.Active,
                CookieName = "efa",
                ExpireTimeSpan = cookieExpiration,
                SlidingExpiration = true,
                AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
                Provider = new CookieAuthenticationProvider
                {
                    OnValidateIdentity = SecurityStampValidator.OnValidateIdentity<UserManager, User, long>(
                        validateInterval: cookieExpiration,
                        regenerateIdentityCallback: (manager, user) => user.GenerateUserIdentityAsync(manager),
                        getUserIdCallback: identity => Identity.Identity.ExtractIdFromClaims(identity))
                }
            });

            app.UseWebApi(new HttpConfig());
        }
    }

设置AuthenticationMode = AuthenticationMode.Active非常重要,我花了整整一天的工作时间才发现这一点。如果将其设置为Passive,身份验证中间件将不会填充HTTP上下文的Identity和Principal对象,并且授权模块将禁止所有请求。

这将使经典的UrlAuthorization模块根据OWIN中间件填充的标识来工作。必须注意安装Nuget包Microsoft.Owin.Host.SystemWeb,否则OWIN将无法与ASP.Net管道集成。

您还可以使用这些现代化的OWIN授权模块: http://leastprivilege.com/2014/06/24/resourceaction-based-authorization-for-owin-and-mvc-and-web-api/ 它们高度可定制并可保护MVC控制器、Web API控制器和静态文件。


3
将以下过滤器添加到默认的App_Start/FilterConfig.cs文件中(在RegisterGlobalFilters方法中)即可解决问题:
filters.Add(new AuthorizeAttribute());

你能在WebForm中使用过滤器吗?听起来很奇怪。我从来没有见过这样的用法,但是我已经搜索了很多。我是否错过了一些明显的东西? - Skuli
此过滤器仅适用于WebApi,您可以将其添加到WebForms应用程序中。应用程序的其余部分(aspx页面)由各种Web.config文件中的条目进行保护:<location><system.web><authorization><allow roles="super"/><deny users="*" /></authorization></system.web></location> - Wayne Bloss
1
只有一个小提示:在上面的评论中,我谈论的是我的当前项目。回到七月份当我回答这个问题时,我可能在谈论另一个项目,但我记不清了!无论如何,祝你好运。 - Wayne Bloss
谢谢。现在明白了。 - Skuli


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接