我有一个每次调用的WCF服务,它在IIS(.svc)中托管.在服务的构造函数中,我根据本文设置了Thread.CurrentPrincipal = HttpContext.Current.User.在这种情况下,HttpContext.Current.User的类型为Microsoft.IdentityModel.Claims.ClaimsPrincipal,并具有从我的自定义被动STS发回的声明.
但是,只要我进入我的服务操作并检查Thread.CurrentPrincipal,当此对象仍然是Microsoft.IdentityModel.Claims.ClaimsIdentity类型时,该对象本身不再与HttpContext.Current.User相同(IsAuthenticated = false) ,AuthenticationType ="",并且Thread.CurrentPrincipal.Identity上的Name为null,而这些值仍然在HttpContext.Current.User上正确填充.这告诉我有些东西拦截了对操作的调用,并错误地将当前主体更改为一些通用的,空的,未经身份验证的声明主体.
我在构造函数和操作中检查了线程ID,并且它在两个地方都是相同的,并且在从HttpContext.Current.User分配后在立即窗口中评估Thread.CurrentPrincipal显示正在正确设置线程标识.构造函数,所以在构造函数和方法之间肯定会执行某些操作,并且有些东西正在改变我的Thread.CurrentPrincipal.
有没有人知道这是做什么的,以及如何防止/解决这种行为?
我一直在寻找一个确切的答案,但似乎大多数答案都是客户端调用并且超出了范围。
问题:我已经有一个访问令牌访问令牌。仅在给定访问令牌的情况下,如何使用 c# 代码获得声明?
我认为:以下是相同的问题,但没有我认为合适的答案。
我对自定义用户配置文件以在应用程序中实现自定义逻辑的最佳方法感到有点困惑。
假设您必须使用此类属性来分析用户:
我必须在哪里实现这种属性?我是否必须自定义 IdentityUser(使用 ApplicationUser)还是必须创建自定义声明?
我刚刚在 Okta 注册了一个开发测试帐户,以使用 Okta 的身份验证服务和用户管理来测试 OIDC。
使用他们的管理门户,我创建了第二个名为 Test Group 的组以及默认的 Everyone 组,并将我的单个用户添加到这两个组中。
然后,我添加了一个名为 My SPA 的应用程序,并为该应用程序分配了测试组访问权限。
使用经典 UI,然后我编辑了 OpenID Connect ID Token 部分并将组声明类型设置为Expression
并添加groups
为声明名称和getFilteredGroups(app.profile.groupwhitelist, "group.name", 40)
表达式。
然后我去编辑了授权服务器。我添加了一个名为“组”的声明,其正则表达式为 *。与任何范围、访问令牌一起使用并始终包含。
然后我使用令牌预览选择我的用户并使用隐式授权流程,但没有显示组。
如何让用户的组在 Okta 身份验证服务器的 ID 或访问令牌中显示为声明?
编辑 我所拥有的屏幕截图:
我理解对于我通常称为"角色"或"权限"的事物的声明的用法.我知道声明更为通用,但从我在实践中看到的情况来看,它通常归结为:如果用户有这组声明,他们可以访问某些区域或执行某些功能.
想象一下wiki应用程序.你可能有一个content_contributor要求,将允许用户添加的内容,一个content_admin要求,将允许用户删除内容和modify_user要求,将允许参与者权限其他用户发放.
将此示例更进一步,我可能希望限制用户,以便他们只能看到自己或他们的团队创建的内容.
如果用户只能看到他们自己创建的内容,我们是否会对他们创建的每个内容提出索赔,或者我们是否会将该授权委托给该应用程序?
我想设置一个WCF,可以通过AJAX从我们的Sharepoint Foundation 2010网站上的自定义webpart加载的javascript调用.为了简化Javascript方面的处理,我想提供一个Restful服务,让Json回到调用者.
问题是,当我使用AJAX调用调用服务器时,SPContext.Current为null.
我在svc文件中使用MultipleBaseAddressWebServiceHostFactory来创建webservice
<%@ Assembly Name="$SharePoint.Project.AssemblyFullName$"%>
<%@ServiceHost Language="C#" Debug="true"
Service="Driftportalen.LvService.SuggestService"
Factory="Microsoft.SharePoint.Client.Services.MultipleBaseAddressWebServiceHostFactory, Microsoft.SharePoint.Client.ServerRuntime, Version=14.0.0.0, Culture=neutral, PublicKeyToken=71e9bce111e9429c"
%>
Run Code Online (Sandbox Code Playgroud)
Web服务的合同是:
[ServiceContract(Namespace = "", ProtectionLevel= ProtectionLevel.None)]
public interface ISuggestServiceTest
{
[WebGet(UriTemplate = "/SuggestAddress/{streetprefix}/", ResponseFormat = WebMessageFormat.Json)]
[OperationContract]
Dictionary<string, GenericAddress> SuggestAddress(string streetprefix);
}
Run Code Online (Sandbox Code Playgroud)
Web服务的实现基本如下.
[Guid("BA6733B3-F98D-4AD8-837D-7673F8BC527F")]
[BasicHttpBindingServiceMetadataExchangeEndpoint]
[ServiceBehavior(IncludeExceptionDetailInFaults = true, AddressFilterMode = AddressFilterMode.Any)]
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class SuggestService : ISuggestServiceTest
{
private SPWeb currentWeb;
public SPWeb CurrentWeb
{
get
{
if (currentWeb == null)
{
var siteUrl = SPContext.Current.Web.Url;
SPSecurity.RunWithElevatedPrivileges(delegate
{
using (var …
Run Code Online (Sandbox Code Playgroud) 我是安全方式和.NET安全方式的新手.我看到了很多关于声明和发行人等的内容,但我对这个定义感到困惑.
简单的英语,索赔是什么?索赔中的发行人/原始发行人是什么?
我正在尝试使用登录ClaimsPrincipal
,然后在 .net core 2.0 中获取 JWT。使用我当前的代码,我从 SignInAsync 函数的结果中得到错误:“没有配置 IAuthenticationSignInHandler 来处理方案的登录:Bearer”
这是我目前使用的控制器:
[Route("Login/{username}")]
public async Task<IActionResult> Login(string username)
{
var userClaims = new List<Claim>
{
new Claim(ClaimTypes.Name, username)
};
var principal = new ClaimsPrincipal(new ClaimsIdentity(userClaims));
var sign = HttpContext.SignInAsync(principal);
await sign;
var res = await HttpContext.AuthenticateAsync();
var token = await HttpContext.GetTokenAsync("access_token");
return Json(token);
}
Run Code Online (Sandbox Code Playgroud)
登录部分已经过测试,可以很好地与 cookie 配合使用。但是,当我JwtBearerDefaults.AuthenticationScheme
在我的 startup.cs 中使用以下代码时:
services.AddAuthentication(config => {
config.DefaultAuthenticateScheme = JwtBearerDefaults.AuthenticationScheme;
config.DefaultChallengeScheme = JwtBearerDefaults.AuthenticationScheme;
})
.AddJwtBearer(config =>
{
config.TokenValidationParameters = Token.tokenValidationParameters;
config.RequireHttpsMetadata = …
Run Code Online (Sandbox Code Playgroud) 我创建了一个示例 MVC 应用程序,它使用身份服务器对 Google 进行身份验证。身份验证工作正常,但是当响应返回时,它缺少“sub”声明并最终出现“sub claim is missing”的错误。
我读了几篇关于将 nameidentifier 映射到 sub 的声明映射的文章。但不知道如何做到这一点。有一些博客说要通知谷歌发布子声明。但又不知道该怎么做。
期待一些帮助!
我有一个使用 Asp.Net Core 2.0 API、Identity Server 和 WPF 应用程序完成的项目。登录后,我可以从 WPF 访问 API。
现在我正在尝试实现角色,以便我能够仅授权某些用户访问 API。
在 Config.cs 中,我声明了我的客户端并添加到范围:
new Client
{
AllowedScopes =
{
IdentityServerConstants.StandardScopes.OpenId,
IdentityServerConstants.StandardScopes.Profile,
IdentityServerConstants.StandardScopes.Email,
IdentityServerConstants.StandardScopes.OfflineAccess,
"fiver_auth_api",
"role"
},
AlwaysIncludeUserClaimsInIdToken=true
}
Run Code Online (Sandbox Code Playgroud)
声明测试用户:
return new List<TestUser>
{
new TestUser
{
SubjectId = "", Username = "", Password = "",
Claims = new List<Claim>
{
new Claim(JwtClaimTypes.Email, "AliceSmith@email.com"),
new Claim(JwtClaimTypes.EmailVerified, "true", ClaimValueTypes.Boolean),
new Claim(JwtClaimTypes.Role, "Admin"),
new Claim(JwtClaimTypes.Scope, "openid offline_access fiver_auth_api")
}
}
}
Run Code Online (Sandbox Code Playgroud)
在我使用的控制器中:
[Authorize(Roles = "Admin")]
Run Code Online (Sandbox Code Playgroud)
为什么我没有在令牌中获得用户声明?
claims ×10
c# ×2
wcf ×2
.net ×1
access ×1
access-token ×1
attributes ×1
federation ×1
jwt ×1
oauth-2.0 ×1
okta ×1
roles ×1
security ×1
token ×1
wcf-security ×1
wif ×1