- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试通过 Identity Server 在我的应用程序上同时使用 OpenId 和 Bearer token 身份验证。
目前的问题是,一旦我对用户进行了身份验证,我仍然需要获得不记名 token 才能为我的 Asp.Net MVC 应用程序调用任何操作方法。
这是我的应用程序的启动文件
public class Startup
{
public void Configuration(IAppBuilder app)
{
AntiForgeryConfig.UniqueClaimTypeIdentifier = Constants.ClaimTypes.Subject;
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});
app.UseOpenIdConnectAuthentication(new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost:44301/identity",
ClientId = "baseballStats",
Scope = "openid profile roles baseballStatsApi",
RedirectUri = "https://localhost:44300/",
ResponseType = "id_token token",
SignInAsAuthenticationType = "Cookies",
UseTokenLifetime = false,
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async n =>
{
var userInfoClient = new UserInfoClient(
new Uri(n.Options.Authority + "/connect/userinfo"),
n.ProtocolMessage.AccessToken);
var userInfo = await userInfoClient.GetAsync();
// create new identity and set name and role claim type
var nid = new ClaimsIdentity(
n.AuthenticationTicket.Identity.AuthenticationType,
Constants.ClaimTypes.GivenName,
Constants.ClaimTypes.Role);
userInfo.Claims.ToList().ForEach(c => nid.AddClaim(new Claim(c.Item1, c.Item2)));
// keep the id_token for logout
nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
// add access token for sample API
nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));
// keep track of access token expiration
nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));
// add some other app specific claim
nid.AddClaim(new Claim("app_specific", "some data"));
n.AuthenticationTicket = new AuthenticationTicket(
nid,
n.AuthenticationTicket.Properties);
}
}
});
app.UseResourceAuthorization(new AuthorizationManager());
app.UseIdentityServerBearerTokenAuthentication(new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:44301/identity",
RequiredScopes = new[] { "baseballStatsApi" }
});
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
app.UseWebApi(config);
}
}
我想将不记名 token 身份验证限制为仅对我的 api url 进行身份验证,并对其他所有内容使用 openID 身份验证。有办法吗?
最佳答案
好的,我在下面的帖子中找到了一些信息
https://github.com/IdentityServer/IdentityServer3/issues/487
可以在此处找到实现链接中讨论的概念的 github 存储库
https://github.com/B3nCr/IdentityServer-Sample/blob/master/B3nCr.Communication/Startup.cs
基本上,您需要使用 app.Map() 将 api url 映射到不同的配置。就我而言,我将启动文件更改为如下所示。
public class Startup
{
public void Configuration(IAppBuilder app)
{
AntiForgeryConfig.UniqueClaimTypeIdentifier = Thinktecture.IdentityServer.Core.Constants.ClaimTypes.Subject;
JwtSecurityTokenHandler.InboundClaimTypeMap = new Dictionary<string, string>();
app.UseCookieAuthentication(new CookieAuthenticationOptions
{
AuthenticationType = "Cookies"
});
var openIdConfig = new OpenIdConnectAuthenticationOptions
{
Authority = "https://localhost:44301/identity",
ClientId = "baseballStats",
Scope = "openid profile roles baseballStatsApi",
RedirectUri = "https://localhost:44300/",
ResponseType = "id_token token",
SignInAsAuthenticationType = "Cookies",
UseTokenLifetime = false,
Notifications = new OpenIdConnectAuthenticationNotifications
{
SecurityTokenValidated = async n =>
{
var userInfoClient = new UserInfoClient(
new Uri(n.Options.Authority + "/connect/userinfo"),
n.ProtocolMessage.AccessToken);
var userInfo = await userInfoClient.GetAsync();
// create new identity and set name and role claim type
var nid = new ClaimsIdentity(
n.AuthenticationTicket.Identity.AuthenticationType,
Thinktecture.IdentityServer.Core.Constants.ClaimTypes.GivenName,
Thinktecture.IdentityServer.Core.Constants.ClaimTypes.Role);
userInfo.Claims.ToList().ForEach(c => nid.AddClaim(new Claim(c.Item1, c.Item2)));
// keep the id_token for logout
nid.AddClaim(new Claim("id_token", n.ProtocolMessage.IdToken));
// add access token for sample API
nid.AddClaim(new Claim("access_token", n.ProtocolMessage.AccessToken));
// keep track of access token expiration
nid.AddClaim(new Claim("expires_at", DateTimeOffset.Now.AddSeconds(int.Parse(n.ProtocolMessage.ExpiresIn)).ToString()));
// add some other app specific claim
nid.AddClaim(new Claim("app_specific", "some data"));
n.AuthenticationTicket = new AuthenticationTicket(
nid,
n.AuthenticationTicket.Properties);
n.Request.Headers.SetValues("Authorization ", new string[] { "Bearer ", n.ProtocolMessage.AccessToken });
}
}
};
app.UseOpenIdConnectAuthentication(openIdConfig);
app.UseResourceAuthorization(new AuthorizationManager());
app.Map("/api", inner =>
{
var bearerTokenOptions = new IdentityServerBearerTokenAuthenticationOptions
{
Authority = "https://localhost:44301/identity",
RequiredScopes = new[] { "baseballStatsApi" }
};
inner.UseIdentityServerBearerTokenAuthentication(bearerTokenOptions);
var config = new HttpConfiguration();
config.MapHttpAttributeRoutes();
inner.UseWebApi(config);
});
}
}
这解决了我的问题。我现在可以使用基于 cookie 的身份验证访问 MVC 页面,并使用不记名 token 身份验证调用 API。
关于c# - 在同一应用程序项目上对 API 使用 Bearer Token 身份验证,对 MVC 使用 OpenId 身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30881720/
我只是更改为 java 配置,但我的其余服务无法识别“Authorization:Bearer”,并且我总是收到 401 我的尝试: 添加@EnableResourceServer注释,其余API工作
我正在开发一个连接到 java(spring 框架)后端的 angular webapp。身份验证是通过 keycloak 服务器完成的。 在我的带有嵌入式 tomcat 服务器的本地机器上,angu
我正在尝试使用 Postman 测试一些端点。 所有端点,都需要一个可以通过登录获得的 token 。 所以我这样做了: 请求 #1 登录成功后,我可以从响应中访问 token ,然后将该 token
好的, 因此,我向 Microsoft Graph API 提出请求,该 API 用于在 One Drive 上创建文件夹。一般来说,我的所有请求都有标题: "Authorization": "Bea
我正在尝试部署一个使用 keycloak 保护的非常简单的 REST 服务,但出现以下错误: Caused by: org.keycloak.authorization.client.util.Htt
我正在尝试实现 OWIN 不记名 token 授权,并基于 this article .但是,我不知道如何实现不记名 token 中的一条额外信息。 在我的应用程序中,我需要从不记名 token 用户
我在 PHP 中制作授权系统,我遇到了传递 JWT token 的 Bearer 方案,我阅读了 [RFC 6750][1]。我有以下疑问: 这如何提高安全性? 在成功授权和登录后,服务器在其正文中使
您好,我正在尝试使用承载身份验证设置信号器。当我调试 Requesttoken 方法时,不记名 token 已成功接收。但是,当我的信号器客户端使用不记名 token 调用 protected (授权
我目前正在处理一组在两个独立但等效的环境(称为 ENV1 和 ENV2)上运行的应用程序。我一直在使用 OAuth 2.0 进行授权,当我从 OAuth 服务请求访问 token 后收到响应时(我通过
我想知道,加密和解密 OAuth2 中使用的 Bearer token 和 Asp.Net Identity 中的代码的内部过程是什么。 一旦服务器接收到一个 token ,它就能够检索 UserId
我正在尝试配置我的 Jwt Bearer 颁发者 key ,但通常在生产中,我使用由 KeyManager 包装的 Azure Key Vault .KeyManager类在依赖注入(inject)中
我在 Azure AD 中注册了一个应用程序。 如果我在 Web API 级别和客户端(SPA 应用程序)级别使用相同的应用程序 ID,为什么两个 Azure AD 身份验证库都这样做 (ADAL J
根据Nexus 3.x docx,“您还需要启用 Realm 中通常概述的Docker Bearer token Realm 。默认情况下,此 Realm 处于非 Activity 状态” 有人知道如
我在 Azure AD 中注册了一个应用程序。 如果我在 Web API 级别和客户端(SPA 应用程序)级别使用相同的应用程序 ID,为什么两个 Azure AD 身份验证库都这样做 (ADAL J
测试时IdentityServer4与 AspNetAuthorization 教程我添加了一个简单的 [Authorize(Roles = "Administrator")] 然后我得到了这个错误:
我正在使用 hapi-auth-bearer-token 插件通过 hapijs 进行 api 身份验证。 这是我的代码: apiServer.register(require('hapi-auth-
我想获取用于 OAuth 目的的 Authorization Bearer header ,但阅读文档看起来有点困惑 use nickel::{Nickel, JsonBody, HttpRouter
我试图将 swagger 与 flask 一起用作 docs api 我现在遇到的问题是,当发送请求时使用 This header Authorization: Bearer 我收到这个错误: {
This nice tutorial很好地介绍了 Android 上的帐户身份验证,并通过使用 Android 的 AccountManager 来实现。 . 但是,我需要使用不记名 token 为
我在 REST api 中使用 JWT Bearer 身份验证方案。为了在身份验证成功后将 jwt token 返回给客户端,目前我正在正文中使用访问 token 响应,如 https://www.r
我是一名优秀的程序员,十分优秀!