我在我的应用程序中使用Microsoft.Owin.Security
(.NET 4.5上的ASP.NET MVC v 5.2.0)。但只是OWIN
的安全部分。当用户想要访问本地受保护的URL时,请求将被重定向到登录页面。但是当我在服务器上发布应用程序时,我得到了这个窗口而不是重定向:
我的登录和注销方法是:
public void LogIn(long userId, string username, string email, bool persistent) {
var claims = new List<Claim>{
new Claim(ClaimTypes.NameIdentifier, userId.ToString(CultureInfo.InvariantCulture)),
new Claim(ClaimTypes.Name, username),
new Claim(ClaimTypes.Email, email),
new Claim(ClaimTypes.IsPersistent, persistent.ToString())
};
var id = new ClaimsIdentity(claims, DefaultAuthenticationTypes.ApplicationCookie);
var ctx = HttpContext.Current.Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignOut(DefaultAuthenticationTypes.ExternalCookie);
authenticationManager.SignIn(new AuthenticationProperties {
IsPersistent = persistent
}, id);
}
public void LogOut() {
var ctx = HttpContext.Current.Request.GetOwinContext();
var authenticationManager = ctx.Authentication;
authenticationManager.SignOut();
}
这是我的创业公司:
public partial class Startup {
public void ConfigureAuth(IAppBuilder app) {
app.UseCookieAuthentication(new CookieAuthenticationOptions {
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/account/log-in/"),
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true,
CookieName = ".some-cookie-name",
ExpireTimeSpan = TimeSpan.FromDays(1),
LogoutPath = new PathString("/account/log-out/"),
SlidingExpiration = true,
ReturnUrlParameter = "continue"
});
}
}
我在global.asax::Application_Start
方法中也有这一行:
AntiForgeryConfig.UniqueClaimTypeIdentifier = ClaimTypes.NameIdentifier;
以及 web.config 中的这些配置:
<system.web>
<authentication mode="None" />
<httpModules>
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" />
</httpModules>
</system.web>
<system.webServer>
<validation validateIntegratedModeConfiguration="false" />
<modules runAllManagedModulesForAllRequests="false">
<remove name="FormsAuthenticationModule" />
<remove name="RoleManager" />
</modules>
</system.webServer>
最后我使用 IIS 7.5 在 Windows 2008 R2 计算机上运行该应用程序。您是否知道我应该怎么做才能使OWIN
在我的服务器上正常工作,就像我的本地一样?
更新:要明确:
假设我有这些行动:
[AllowAnonymous]
public ActionResult AnonymousAction() { }
[Authorize]
public ActionResult UsersAction() { }
一个用于匿名用户,另一个用于登录用户(具有良好的属性装饰)。匿名用户可以轻松访问AnonymousAction
,而不会出现任何错误或错误行为。但是当他们(我的意思是匿名用户)想要访问UsersAction
时,他们不会被重定向到登录页面,而是会看到我上面提到的窗口。
答案 0 :(得分:3)
与Erik一样,您的IIS设置不正确,很可能是未正确配置身份验证。
转到IIS,选择您的站点,然后选择“身份验证”部分。它应该如下所示:
确保您的匿名身份验证已启用,其他所有内容都已禁用。
答案 1 :(得分:2)
它与启动时的登录页面URL有关吗?我注意到这一行;
LoginPath = new PathString("/account/log-in/")
始终指向服务器的根URL。所以,如果你要部署,比如说,
http://myserver.com/application1
然后登录页面将是
http://myserver.com/account/log-in/
但你可能意味着
http://myserver.com/application1/account/log-in/
所以你可能想尝试类似的东西;
LoginPath = new PathString("~/account/log-in/")
带有~
字符的。注销网址也是一样。
答案 2 :(得分:1)
嗯,这很简单。根据{{3}}(感谢他),我意识到我应该注意响应的http代码。这是一个401 - Unauthorized
代码。所以,我问自己为什么会这样?直到我找到@trailmax's answer。然后,我唯一需要的是创建以下属性:
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, AllowMultiple = true, Inherited = true)]
public class AuthorizeAttribute : System.Web.Mvc.AuthorizeAttribute {
protected override void HandleUnauthorizedRequest(AuthorizationContext filterContext) {
if (filterContext.HttpContext.Request.IsAuthenticated) {
filterContext.Result = new HttpStatusCodeResult((int)System.Net.HttpStatusCode.Forbidden);
} else {
base.HandleUnauthorizedRequest(filterContext);
}
}
}