我已将Owin配置为在身份验证时发出令牌和Cookie:
public void Configuration(IAppBuilder app)
{
var cookieOptions = new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true, // JavaScript should use the Bearer
//AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
CookieName = "MyCookie",
LoginPath = new PathString("/app/index.html#/login"),
};
var oAuthServerOptions = new OAuthAuthorizationServerOptions
{
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
Provider = new MyAuthorizationServerProvider(),
};
var oAuthBearerOptions = new OAuthBearerAuthenticationOptions
{
};
// Must be registered in this order!
app.UseCookieAuthentication(cookieOptions);
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseOAuthBearerAuthentication(oAuthBearerOptions);
}
这很好用 - 它会发出我的SPA的Bearer令牌来调用我的API和cookie,这样我的旧学校MVC页面也可以登录。
但是如果我在声明我想使用CookieAuth之前注册OAuth服务器,则不会发出cookie。换句话说,如果我这样做,它就不起作用:
app.UseOAuthAuthorizationServer(oAuthServerOptions);
app.UseCookieAuthentication(cookieOptions);
app.UseOAuthBearerAuthentication(oAuthBearerOptions);
此外,如果我取消注释此行,它也不会发出cookie:
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
我的问题是为什么与Owin的注册顺序很重要?为什么将Cookie中的AuthenticationType设置为"ApplicationCookie"
也会导致失败?
答案 0 :(得分:4)
我不熟悉UseOAuthAuthorizationServer()
中间件,但我认为它与其他外部身份验证中间件(例如Google中间件)的工作方式相同。
重定向到外部源进行身份验证的身份验证中间件仅在每个浏览会话的开始时使用一次。然后,它会将即将到来的请求的身份验证推迟到维护会话的cookie身份验证。这很好,因为这意味着外部认证的开销只对每个会话进行一次。
想要设置cookie的中间件通常不会自行完成。相反,它使用AuthenticationResponseGrant
在Owin上下文中设置属性。然后,cookie中间件处理授权,提取身份并设置cookie。
为此起作用:
AuthenticationResponseGrant
中的身份验证类型必须与Cookie中间件的类型匹配。因此,更改注册顺序违反了1.并且排除了身份验证类型违反了2。
如果您需要更多详细信息,我已经写过in depth blog post。