您是正确的,没有关于如何使用经典ASP.Net授权与OWIN安全中间件的资源。
我正在使用ASP.Net Web Pages,因此我的实验与您类似(我们都试图保护静态文件,即aspx或cshtml)。
我的实验非常可怕。我差点撞墙。
最后我发现了如何使它运行,这就是我所做的:
- 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>
- 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控制器和静态文件。
Web.config
文件中的条目进行保护:<location><system.web><authorization><allow roles="super"/><deny users="*" /></authorization></system.web></location> - Wayne Bloss