Microsoft.Owin.Security.IAuthenticationManager不会重定向到登录页面

时间:2014-10-08 13:45:26

标签: asp.net-mvc iis owin asp.net-mvc-5.2 owin.security

我在我的应用程序中使用Microsoft.Owin.Security(.NET 4.5上的ASP.NET MVC v 5.2.0)。但只是OWIN的安全部分。当用户想要访问本地受保护的URL时,请求将被重定向到登录页面。但是当我在服务器上发布应用程序时,我得到了这个窗口而不是重定向:

enter image description here

我的登录和注销方法是:

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时,他们不会被重定向到登录页面,而是会看到我上面提到的窗口。

3 个答案:

答案 0 :(得分:3)

与Erik一样,您的IIS设置不正确,很可能是未正确配置身份验证。

转到IIS,选择您的站点,然后选择“身份验证”部分。它应该如下所示: Anonymous Authentication = Enabled

确保您的匿名身份验证已启用,其他所有内容都已禁用。

答案 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);
        }
    }
}