我正在尝试进行混合模式身份验证,以便能够将某些用户置于联合身份验证上,而其他用户则使用Forms身份验证.
我正在使用WIF,我设置了我的STS,一切都很开心,当我处于联邦模式时,通过这种方式关闭所有身份验证:
<authorization>
<deny users="?" />
</authorization>
<authentication mode="None" />
Run Code Online (Sandbox Code Playgroud)
我登录到我的主应用程序然后当我登录到我的侧面应用程序时,它将让我以静默方式登录,因为会话cookie已经生成并且用户已经过身份验证.
但是当我使用Forms身份验证时,当我登录到我的应用程序时,它会将我带到我理解的登录页面,因为用户未经过身份验证,但即使有了会话cookie,它也不会默默地重定向它.
我知道我需要将onEndRequest重定向到STS以对用户进行身份验证,如果用户已经过身份验证,那么它将生成FedAuth cookie并且它会以静默方式登录我,
有谁知道如何实现这一点,我研究时没有找到有关它的资源.
阿拉
forms-authentication passive-sts wif single-sign-on ws-federation
这涉及到,但我很确定不会重复,我的问题是:寻找安全可靠的STS实现
由于要求,来自业务和一些研究的一些输入使我相信,不是实现安全令牌服务来包装我的自定义身份提供者,我可以将令牌的发布委托给身份提供者本身.
身份提供程序是一种WCF服务,它根据用户的某些标识数据在成功验证用户身份时返回声明集合.例如
[ServiceContract(Namespace = "http://namespace")]
public interface IIdService
{
[FaultContract(typeof(IdServiceFault))]
[OperationContract]
ICollection<Claim> Authenticate(string idDatum1, string idDatum2);
}
Run Code Online (Sandbox Code Playgroud)
哪里Claim是Microsoft.IdentityModel.Claims.Claim.我目前只关注一个仅有质量的STS实现示例,作为一个网站项目,但如果可能的话,我想简单地将发布和签署令牌的任务转移到身份提供者,并最终将其限定为WS -Federation Identity Provider,我稍后可以将其包含在Azure Access Control的提供程序中.
如果可以,我需要在WCF服务中做什么?
我有一个自定义STS服务,接收用户名/密码作为客户端凭据,如果用户名/密码有效,则生成令牌.我在自己的用户商店中进行用户名/密码检查.
但是现在我需要让我的自定义STS接收SAML 2.0令牌(从其他身份提供者发出)并验证令牌,验证声明并为依赖方(WCF服务)生成令牌,该令牌仅信任来自自定义STS的令牌.
我们有什么方法可以做到吗?有样品吗?
我尝试使用"IssuedToken"作为客户端凭据类型,但不确定如何进行此操作.任何帮助深表感谢.
我试过这个,但似乎已经过时了.
配置是:ADFS 2.0作为IdP(支持WS-Federation和SAML 2.0),ASP.NET app作为服务提供者.当SPS使用WS-Federation标准(使用WIF)请求ADFS时,它允许我自动登录到ADFS,即使新会话启动也没有登录弹出窗口,因此Kerberos令牌可以按预期完成其工作.但是,如果每次打开IE9并重定向到ADFS时都使用SAML 2.0(使用ComponentSpace.SAML.2 lib),我会被要求在标准的小弹出登录窗口中输入我的Windows域凭据.是否有任何SAML 2.0参数或其他技术让我像在WS-Fed案例中那样摆脱这个窗口?谢谢
我在MVC 3站点上使用WS Federated(Claims Aware)身份验证,但在身份验证失败时,保留一些发送JSON的API控制器无法返回重定向.我有一个名为API的区域,它有几个只返回JSON的控制器,这些控制器都从相同的基类继承.我想发送合法的401错误响应,而不是默认情况下发生的302重定向.
我按照我发现的一些方向WSFederationAuthenticationModule,通过我在API控制器操作中添加的过滤器创建了一个自定义音乐会:
public class WSFederationServiceAuthenticationModule : WSFederationAuthenticationModule
{
private static Log4NetLoggingService logger = new Log4NetLoggingService();
public const string IsServiceIndicator = "ROIP.IsService";
protected override void OnAuthorizationFailed(AuthorizationFailedEventArgs e)
{
base.OnAuthorizationFailed(e);
var isService = HttpContext.Current.Items[IsServiceIndicator];
if (isService != null)
{
logger.Info("WSFedService: Found IsService");
e.RedirectToIdentityProvider = false;
}
else
{
logger.Info("WSFedService: Did not find IsService");
}
}
}
public class WSFederationServiceAuthAttribute : ActionFilterAttribute
{
private static Log4NetLoggingService logger = new Log4NetLoggingService();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
base.OnActionExecuting(filterContext);
// …Run Code Online (Sandbox Code Playgroud) 我几天来一直在寻找这个问题的答案,但我没有找到任何成功.我会发布链接,但它可能会占用整个页面.
所以这就是我所拥有的......
我有一个MVC应用程序,它使用WC-Federation协议.我已经能够配置应用程序,以便它对用户进行身份验证,并从ADFS返回声明.这很完美.我也可以提取所有索赔,没有任何问题.但我在控制器中的一个操作中执行此操作.
这就是我想要做的......
我想使用ADFS来验证用户,但我想使用自己的内部角色来授权用户访问特定的控制器(例如[Authorize(Roles = "CoolRole")]).我希望能够这样做,因为我已经有一个使用OAuth 2.0的Web API,后端SQL Server数据库来管理用户和角色(内部和外部用户).我现在想要一个允许内部用户的安全门户通过单点登录体验访问数据.看一下Controller模型,我注意到有一些属性与身份验证过程(OnAuthentication,OnAuthenticationChallenge)相关联,一个属性与授权过程相关联(OnAuthorization.)
我不一定需要代码,但我觉得我已经打了一块砖,我需要指向正确的方向.
UPDATE
我试过这个:
protected override void OnAuthorization(
System.Web.Mvc.AuthorizationContext filterContext)
{
//Private class to create a new IPrincipal based on my AppUserMgr
var user = _setCurrentUser(
(ClaimsIdentity)filterContext.HttpContext.User.Identity);
filterContext.HttpContext.User = user;
base.OnAuthorization(filterContext);
}
Run Code Online (Sandbox Code Playgroud)
这返回了401(未授权)响应.
和...
protected override void OnAuthentication(
System.Web.Mvc.Filters.AuthenticationContext filterContext)
{
//Private class to create a new IPrincipal based on my AppUserMgr
var user = _setCurrentUser(
(ClaimsIdentity)filterContext.HttpContext.User.Identity);
filterContext.Principal = user;
base.OnAuthorization(filterContext); …Run Code Online (Sandbox Code Playgroud) 天儿真好!
我在这方面没有看到太多,因为在写这篇文章时它非常新颖.我正在尝试编写一个服务结构应用程序,在用户通过ACS进行身份验证后,它将为Web应用程序(html/js)提供服务.我可以轻松地在非服务结构环境中使用OWIN,即IIS后面的传统Asp Net应用程序.我正在尝试使用Azure Access Control进行令牌身份验证.
那么与我现在使用服务结构的事实有什么关系改变了OWIN的工作方式?下面是我的服务结构应用程序中的Startup.cs中的OWIN ConfigureApp()函数:
public static void ConfigureApp(IAppBuilder appBuilder)
{
appBuilder.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
appBuilder.UseCookieAuthentication(new CookieAuthenticationOptions());
appBuilder.UseWsFederationAuthentication(
new WsFederationAuthenticationOptions
{
Wtrealm = _realm,
MetadataAddress = _acsXmlMetaDataUrl
});
// Configure Web API for self-host.
HttpConfiguration config = new HttpConfiguration();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
appBuilder.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)
请注意我是如何在最终用于为我的浏览器html/js应用程序提供服务的web api 中间件之前注入WsFederation中间件的.现在,当这个启动并且我进行健全性测试时,例如导航到REST URL,我的内容会立即提供,而不是重定向到Azure Access Control以登录并获取身份验证令牌.在我使用相同OWIN配置的传统Asp Net应用程序中,我确实在提供任何资源之前将其重定向到Azure Access Control.
所以我的问题是如何将WsFed中间件注入OWIN管道,以便在服务结构上下文中工作?
非常感谢任何帮助,谢谢你的时间!
我正在使用 wsfederation(使用 pingfederate 作为 IDP)进行身份验证。这对于第一次获取访问令牌工作正常,但是当令牌过期时,我需要获取新令牌或刷新令牌。在 .NET 框架 4.7.2 中,它在我们使用WS2007FederationHttpBinding和WSTrustChannelFactory获取新令牌时工作正常。但是在 .NET CORE 中,我没有任何方法可以强制获取访问令牌。
有没有人知道如何通过从我的控制器调用 API 来获取新令牌?
上下文是一个在端口HTTP上的Docker容器中托管的aspnetcore 2.1网站,并且使用了仅暴露HTTPS 443的Nginx反向代理。
该网站可以从外部通过HTTPS访问,它可以重定向到HTTPS上的STS网站,该网站可以重定向到HTTPS上的/ signin-wsfed。
但是,/ signin-wsfed 的响应位置是HTTP。
这是请求:
POST https://core-mydocker.####/signin-wsfed HTTP/1.1
Accept: image/gif, image/jpeg, image/pjpeg, application/x-ms-application, application/xaml+xml, application/x-ms-xbap, */*
Referer: https://sts-mydocker.####/Pages/Email/Default.aspx?wtrealm=https%3a%2f%2fcore-mydocker.####%2f&wa=wsignin1.0&wreply=https%3a%2f%2fcore-mydocker.####%2fsignin-wsfed&wctx=#####
Accept-Language: fr-FR,fr;q=0.8,en-GB;q=0.6,en;q=0.4,ja;q=0.2
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.2; WOW64; Trident/7.0)
Content-Type: application/x-www-form-urlencoded
Accept-Encoding: gzip, deflate
Host: core-mydocker.####
Content-Length: 10612
Connection: Keep-Alive
Cache-Control: no-cache
Run Code Online (Sandbox Code Playgroud)
和响应:
HTTP/1.1 302 Found
Server: nginx/1.12.2
Date: Thu, 21 Feb 2019 09:39:34 GMT
Content-Length: 0
Connection: keep-alive
Cache-Control: no-cache
Pragma: no-cache
Expires: Thu, 01 Jan 1970 00:00:00 GMT
Location: http://core-mydocker.####/Authenticate
Set-Cookie: …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用Azure ACS添加新的auth方法来支持ADFS中的用户,但我遇到了一个非常具体的问题.
我可以使用以下配置验证SAML2.0:
var audienceRestriction = new AudienceRestriction(AudienceUriMode.Never);
var issuerRegistry = new ConfigurationBasedIssuerNameRegistry();
issuerRegistry.AddTrustedIssuer("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "https://XXXX.accesscontrol.windows.net/");
app.UseWsFederationAuthentication(new WsFederationAuthenticationOptions
{
MetadataAddress = "https://XXXXX.accesscontrol.windows.net/federationmetadata/2007-06/federationmetadata.xml",
Wtrealm = "http://someurl/",
SecurityTokenHandlers = new SecurityTokenHandlerCollection
{
new EncryptedSecurityTokenHandlerEx(new X509CertificateStoreTokenResolver(StoreName.My,StoreLocation.LocalMachine)),
new SamlSecurityTokenHandlerEx
{
CertificateValidator = X509CertificateValidator.None,
Configuration = new SecurityTokenHandlerConfiguration()
{
IssuerNameRegistry = issuerRegistry,
AudienceRestriction = audienceRestriction
}
}
},
});
Run Code Online (Sandbox Code Playgroud)
使用这样的处理程序:
public class SamlSecurityTokenHandlerEx : Saml2SecurityTokenHandler, ISecurityTokenValidator
{
public override bool CanReadToken(string securityToken)
{
return base.CanReadToken(XmlReader.Create(new StringReader(securityToken)));
}
public ClaimsPrincipal ValidateToken(string securityToken, TokenValidationParameters validationParameters,
out SecurityToken validatedToken) …Run Code Online (Sandbox Code Playgroud) ws-federation ×10
asp.net-mvc ×3
c# ×3
asp.net-core ×2
saml-2.0 ×2
wcf ×2
wif ×2
acs ×1
adfs ×1
adfs2.0 ×1
asp.net ×1
azure ×1
docker ×1
identity ×1
login ×1
passive-sts ×1
pingfederate ×1
saml ×1