我正在制作一个OWIN应用程序来自我托管网站。我在验证部分遇到问题。我正在寻找的基本流程是:
SecuritySessionToken
并构建ClaimsIdentity
,然后返回AuthenticationTicket
。第一步对我来说很好。第2步和第3步是我遇到麻烦的地方。
这就是我在启动类中的配置方法:
public void Configuration(IAppBuilder app)
{
CookieAuthenticationOptions options = new CookieAuthenticationOptions
{
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType,
CookieName = "MyCookieName",
CookiePath = "/cookiePath",
AuthenticationMode = AuthenticationMode.Active
};
// Not relevant how this module is made. It helps with
SessionAuthenticationModule module = this.CreateModule();
app.Use(typeof(MyCookieAuthenticationMiddleware), app, options, module);
WsFederationConfiguration fedConfig = new WsFederationConfiguration();
fedConfig.Issuer = "https://mySTS.com/NotRealUrl/";
SecurityTokenHandlerCollection handlerCollection = new SecurityTokenHandlerCollection(new List<SecurityTokenHandler>() { new SamlSecurityTokenHandler() });
WsFederationAuthenticationOptions wsFederationOptions = new WsFederationAuthenticationOptions
{
Configuration = fedConfig,
Wtrealm = "http://localhost/MyApp/NotRealUrl",
Wreply = "https://mySTS.com/NotRealUrl/Login",
SecurityTokenHandlers = handlerCollection,
AuthenticationMode = AuthenticationMode.Active,
AuthenticationType = WsFederationAuthenticationDefaults.AuthenticationType
};
app.Use(typeof(MyWsFederationAuthenticationMiddleware), app, wsFederationOptions);
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.Use<MyMiddleware>();
}
app.Use(typeof(MyCookieAuthenticationMiddleware), app, options, module);
之前的部分可以正常使用。也就是说,当cookie存在时,我使用自定义cookie身份验证中间件(MyCookieAuthenticationMiddleware
)来生成AuthenticationTicket
。
无法正常工作的部分是WsFederation身份验证中间件部分。我为此创建了自己的中间件(MyWsFederationAuthenticationMiddleware
),这样我就可以看一下自app.UseWsFederationAuthentication(wsFederationOptions)
直接不能为我工作的事情。我正在查看WsFederationAuthenticationHandler.cs
的源代码来指导我,但我仍然对一些整体概念感到困惑。
问题
AuthenticateCoreAsync()
的{{1}}。但
我在什么时候将其重定向到STS以获取SAML令牌?
我是否只是等待管道点击MyCookieAuthenticationHandler
AuthenticateCoreAsync()
,如果用户不是,
经过身份验证,然后获取令牌?WsFederationAuthenticationHandler.cs
,似乎是他们的
MyWsFederationAuthenticationHandler
的实施可能正在做
我想要的是?更具体地说,如果它是401状态代码,那么make
一个ApplyResponseChallengeAsync()
并使用该消息重定向到STS?感谢并为这篇长篇文章感到抱歉。
更新1
我忘了提及,当我使用WsFederationMessage
(而不是我自己的app.UseWsFederationAuthentication(wsFederationOptions)
)运行我的代码时,我收到了400&#34;错误的请求 - 请求太长&#34;错误。 URL非常长,看起来像包含各种查询参数,包括wtrealm,wctx,wa和wreply,每个参数都包含url编码的字符串。看起来wctx真的很长。我想它是一些base64编码对象。不幸的是,我真的不知道发生了什么。
答案 0 :(得分:1)
我认为,问题是两个中间件都有AuthenticationMode
Active
您应该将CookieAuthenticationOptions.AuthenticationType
更改为CookieAuthenticationDefaults.AuthenticationType
,然后将WsFederationAuthenticationOptions.AuthenticationMode
设置为被动。
我推荐一个自定义控制器。如果用户访问此控制器,您必须手动触发OwinContext.Authentication
WsFederationAuthenticationDefaults.AuthenticationType
上的ApplyResponseChallengeAsync
身份验证并返回401.这应触发WsFederationAuthenticationHandler
在WsFederationAuthenticationOptions.Notifications
上的CookieAuthenticationDefaults.AuthenticationType
方法中,您可以发布一个身份类型为 glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 0, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(0));
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 1, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(1));
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 2, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(2));
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 3, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(3));
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 4, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(4));
glTexImage2D(GL_TEXTURE_CUBE_MAP_POSITIVE_X + 5, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, texData(5));
的新AuthTicket。
现在,来自身份提供者的身份将转换为带有cookieauth的本地身份。