我看到OpenID登录在任何地方都可用,并决定我应该考虑在我的服务器上实现我自己的提供程序,以便我可以控制我的信息和登录.
令人惊讶的是,这非常复杂和困难.
即使许多站点允许OpenID登录(例如这个),我发现了以下问题:
http://en.wikipedia.org/wiki/OpenID#Security
例如,从2013年8月开始,关于使用Google Plus/Profiles作为代表的SO的解决方案现在得到了Google的错误,称今年4月将从Google移除OpenID 2.0支持并替换为OpenID Connect:
将OpenID委托给Google(不是Google Apps)
有人甚至提供简单的OpenID Connect 单一身份提供商吗?查看OpenID的OpenID提供程序软件列表根本没有提到任何OpenID Connect解决方案,更不用说该页面在4年内没有更新!
http://wiki.openid.net/w/page/12995226/Run%20your%20own%20identity%20server
仔细查看所有这些信息,我很高兴我几年前搁置了我的计划,在我的服务器上实现OpenID 2.0,因为它看起来已经过时了,我想不出一个简单的方法来证明我的身份.令人惊讶的是,我不能只安装一个软件包并编辑配置文件.大多数更简单的实现涉及安装和使用PHP,它有自己需要了解的安全问题.
那么 - 任何一个OpenID专家和它的目标谁能给我一些关于如何设置我的身份提供者或者是否值得困难的建议?我希望控制我的信息和分发我的电子邮件地址以及拥有永久性身份,但如果标准不断变化那么它就不是永久性的.
我想使用OpenID Connect保护我们的移动应用程序的REST后端.简而言之,应用程序的用户应在通过REST后端(多个服务)获取敏感数据之前对自身进行身份验证(用户名/密码).
在初始身份验证之后,他们应该会收到一个ID /访问令牌,然后他们可以在其应用会话的剩余时间内用于服务通信.获取此ID令牌非常重要,因为它包含后端所需的信息.
作为实现此场景的Identity Provide,我想使用KeyCloak.但是,我不确定要实现的最佳身份验证流程.我读这个和这个计算器的职位,但我仍然不能确定,如果我需要的解决方案是有效的/安全/可以接受的.
从我读到的有关openID Connect的内容来看,推荐的openID Connect auth流程是"3条腿授权代码流程 ",其中包括:
对于基于浏览器的Web应用程序来说,这一切听起来都很好,但在我们的应用程序中,我们希望避免使用外部登录页面,而是拥有一个"本地"应用内登录页面,以免过多地破坏用户的体验.此外,我们的应用程序有一个功能,让您"登录".在这种情况下,用户只登录一次,然后应用程序在启动时在后台获取所有令牌.
因此,根据我们的要求,我发现了这篇博客文章,该文章使用了一个两条腿的 资源所有者凭据流程方法,该方法允许应用程序进行身份验证并在一个请求中收集令牌,而无需导航到keycloak登录页面.
我测试了这个,这个解决方案似乎提供了我们需要的功能.此外,在我们的案例中,app和KeyCloak(=自发布的OpenID提供商)仅在内部使用,属于同一法人实体.
在我们的使用案例中,是否允许使用双腿方法,如果没有,为什么不呢?这种方法是否会带来一些安全风险?
我真的希望听到你们的意见!
更新16-10-2018:哇伙计们,我从Nate Barbettini 找到了一个非常有趣的教程演示文稿(https://www.youtube.com/watch?v=996OiexHze0),其中包括oauth,openid connect和认证流程的类型在非常明确的条件下,但也非常深入.我建议所有人在使用ouath/openid connect进行复杂的授权/身份验证之前进一步冒险.
问候,
金荷兰
我们有自己的OpenID Connect Provider.我们希望使用Owin中间件在身份验证请求中传递自定义查询参数.我们无法找到使用Microsoft.Owin.Security.OpenIdConnect程序集实现此方法的方法.甚至我们也找不到如何向Authentication Request添加标准请求参数(例如" login_hint parameter").
例如,Google有" login_hint "和" hd "参数(https://developers.google.com/accounts/docs/OAuth2Login#sendauthrequest),我们希望拥有几乎相同的参数.但我们甚至找不到如何使用Owin将这些参数发送给Google.试过这段代码:
var googleOptions = new GoogleOAuth2AuthenticationOptions()
{
ClientId = "...",
ClientSecret = "...",
};
app.UseGoogleAuthentication(googleOptions);
...
public ActionResult ExternalLogin(string provider)
{
var ctx = Request.GetOwinContext();
var properties = new AuthenticationProperties();
properties.Dictionary.Add("login_hint ", "myemail@gmail.com");
properties.Dictionary.Add("hd", "hd");
ctx.Authentication.Challenge(properties, provider);
return new HttpUnauthorizedResult();
}
Run Code Online (Sandbox Code Playgroud)
但是生成身份验证请求网址时将不使用" login_hint "和" hd "参数.
非常感谢任何帮助解决这个问题.
我有一个使用OWIN中间件的应用程序用于OpenIdConnect.startup.cs文件使用app.UseOpenIdConnectAuthentication的标准实现.cookie被设置为浏览器,但它出错:
IDX10311:RequireNonce为'true'(默认值),但validationContext.Nonce为null.nonce无法验证.如果您不需要检查nonce,请将OpenIdConnectProtocolValidator.RequireNonce设置为"false".
我发现当像大多数调试项目一样运行fiddler时,会发生这种情况.返回错误,但如果我返回该站点,一切正常,我的用户已通过身份验证.有没有人在运行提琴手时看到这种行为?
随着提琴手:
没有提琴手跑:
想法?我可以在不运行fiddler的情况下绕过它,但是在调试时,运行fiddler来检查流量也会很不错.
这可能是基于意见的,但我仍然怀疑是否有最佳实践,因为我对websocket实践几乎一无所知
我有一个从我自己获得JWT令牌的SPA OP.然后它使用该JWT连接到我使用REST和WebSockets的其他服务.
就REST来说,它非常简单:
Authorization: Bearer ...)并提供对受保护资源的访问,或者使用a响应401,让SPA知道它需要请求新令牌.现在有websockets:
在加载SPA期间,一旦我获得了令牌,我就打开了一个WS到我的web服务.我发送的第一条消息是login_message我的JWT,然后我保留在服务器的websocket实例上以了解谁在发送消息.我收到的每个后续消息,我都会验证JWT是否已过期.
据我所知,一旦它到期,我面临两个选择:
删除websocket时会token_expired出现某种错误,并在令牌刷新后强制浏览器建立新的websocket连接.
保持websocket打开,返回错误消息并发送新的登录消息(刷新令牌后)
不要使用登录消息,只需在每个请求中发送JWT.
问题:您会推荐哪种方法?为什么?在安全性和性能方面.我没有列出其他常见做法吗?
我正在使用Identity Server 4而我正在尝试使用内省端点,但只是通过文档我没有得到它.
文档只是给出了这个例子
POST /connect/introspect
Authorization: Basic xxxyyy
token=<token>
Run Code Online (Sandbox Code Playgroud)
现在,为什么有这个基本的身份验证,什么应该是xxxyyy?我的意思是,我的应用程序中没有基本的身份验证设置.我刚刚使用ASP.NET Core设置了Identity Server 4,如下所示ConfigureServices:
services.AddIdentityServer()
.AddTemporarySigningCredential()
.AddInMemoryApiResources(ApiResourceProvider.GetAllResources())
.AddAspNetIdentity<Usuario>();
Run Code Online (Sandbox Code Playgroud)
并在 Configure
app.UseIdentity();
app.UseIdentityServer();
Run Code Online (Sandbox Code Playgroud)
现在我只尝试了一个POST到/ connect/introspect与身体token=<token>,但它返回了404.
我相信我真的没有得到它.
我们如何在ASP.NET Core中将内省端点与Identity Server 4一起使用?
我按照 Identity Server 4 文档在我的本地机器上设置了一个示例服务器。我的问题是,在我登录后,应用程序卡在“signin-oidc”页面上,并且日志显示 404。我按照说明进行了 T,甚至删除了所有内容并重新开始。因此,根据http://docs.identityserver.io/en/latest/quickstarts/2_interactive_aspnetcore.html 上的文档,当前设置是一个准系统 IdSvr4 项目 (is4inmem) 和一个新的 ASPNetCore MVC 应用程序
我所做的唯一更改是将所有 URL 更改为 HTTPs 并使用 appsettings.json 文件而不是Config类。因为我没有改变任何实质性的东西,所以我无能为力。
我的 MVC 的日志看起来像这样
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 GET https://localhost:44377/Home/Claims
info: Microsoft.AspNetCore.Authorization.DefaultAuthorizationService[2]
Authorization failed.
info: Microsoft.AspNetCore.Authentication.OpenIdConnect.OpenIdConnectHandler[12]
AuthenticationScheme: oidc was challenged.
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 559.8895ms 200 text/html;charset=UTF-8
info: Microsoft.AspNetCore.Hosting.Diagnostics[1]
Request starting HTTP/2 POST https://localhost:44377/signin-oidc application/x-www-form-urlencoded 547
info: Microsoft.AspNetCore.Hosting.Diagnostics[2]
Request finished in 3.2205ms 404
Run Code Online (Sandbox Code Playgroud)
虽然主 IdSvr4 项目的日志看起来像这样
[00:26:01 Debug] IdentityServer4.Validation.AuthorizeRequestValidator
Start authorize request protocol …Run Code Online (Sandbox Code Playgroud) 我正在尝试验证从 azure 活动目录获得的访问令牌。
The I obtained the token from https://login.microsoftonline.com/{{my tennant guid}}/v2.0
however the issuer in the token that comes back is https://sts.windows.net//{{my tennant guid}}/ which doent match.
If I check that config at .well-known/openid-configuration the issuer is as expected https://login.microsoftonline.com/....
I've found a similar issue reported on git hub here https://github.com/AzureAD/microsoft-authentication-library-for-js/issues/560
the outcome from this is to manually edit the manifest json in the application registration in AAD and set "accessTokenAcceptedVersion": 2
I've done this but …
我在一些文章中看到,据说OpenID Connect将取代SAML作为SSO的主要协议.我不确定openID connect如何处理与不同服务提供商的会话管理功能以及如何使用它来实现单点注销?目前,是否有支持OpenID连接的IDM服务器(开源或商用)作为SSO IDP(作为SAML2 SSO IDP的替代品)?
我对使用新的ASP.Net OpenID Connect框架有疑问,同时在身份验证管道中添加新的声明,如下面的代码所示.我不确定幕后会发生多少'魔术'.我认为我的大部分问题都集中在不了解OWIN认证中间件而不是OpenID Connect上.
Q1.我要手动设置HttpContext.Current.User和Thread.CurrentPrincipal自OwinContext.Authentication.User?
Q2.我希望能够像以前一样将对象类型添加到声明中System.IdentityModel.Claims.Claim.新System.Security.Claims.Claim类只接受字符串值?
Q3.我是否需要使用新的SessionSecurityToken包装我ClaimsPrincipal在System.Security.Claims.CurrentPrincipal序列化到一个cookie -我使用的 app.UseCookieAuthentication(new CookieAuthenticationOptions());,但现在肯定在维护期间我添加任何额外的权利要求书,做究竟是什么SecurityTokenValidated事件?
public void ConfigureAuth(IAppBuilder app)
{
app.SetDefaultSignInAsAuthenticationType(CookieAuthenticationDefaults.AuthenticationType);
app.UseCookieAuthentication(new CookieAuthenticationOptions());
app.UseOpenIdConnectAuthentication(
new OpenIdConnectAuthenticationOptions
{
ClientId = clientId,
Authority = authority,
PostLogoutRedirectUri = postLogoutRedirectUri,
Notifications = new OpenIdConnectAuthenticationNotifications()
{
SecurityTokenValidated = (context) =>
{
// retriever caller data from the incoming principal
var UPN = context.AuthenticationTicket.Identity.FindFirst(ClaimTypes.Name).Value;
var db = new SOSBIADPEntities();
var user = …Run Code Online (Sandbox Code Playgroud)