【发布时间】:2017-03-09 11:27:35
【问题描述】:
我正在将我用 (VS2013) MVC5 和 Angular 1 编写的旧应用程序迁移到 (VS2015) MVC 6 和 Angular 2。在我的 MVC 5 应用程序中,我曾经在我曾经使用以下代码行将其存储到会话的 Web UI 端:
//Store token details
[HttpPost]
public void EvaluateToken(string token)
{
JwtSecurityTokenHandler tokenHandler = new JwtSecurityTokenHandler();
SecurityToken st = tokenHandler.ReadToken(token);
var tokenData = ((JwtSecurityToken)st);
var claims = tokenData.Claims.Where(t => t.Type.Equals(" ")).ToList();
ClaimsIdentity cIdentity = new ClaimsIdentity(DefaultAuthenticationTypes.ExternalBearer);
ci.AddClaims(claims);
AuthenticationManager.SignIn(new AuthenticationProperties() { IsPersistent = true }, cIdentity );
string user = "//get username from token";
ClaimsPrincipal cPrincipal = new ClaimsPrincipal (cIdentity);
//write to cookie
SessionSecurityToken sst = new SessionSecurityToken(cPrincipal , TimeSpan.FromMinutes(20));
sst.IsReferenceMode = true;
SessionAuthenticationModule ssm = FederatedAuthentication.SessionAuthenticationModule;
ssm.WriteSessionTokenToCookie(sst);
}
上面的代码适用于非 aspnetcore 项目,我可以使用以下代码行从授权上下文中检索声明,其中 action 包含在被调用的相应操作方法上的属性上的声明集,并且val 包含一个布尔值 true 或 false 指定声明在 context.Principal 中是否存在。
public class CustomClaimsAuthorizationManager: ClaimsAuthorizationManager
{
public override bool CheckAccess(AuthorizationContext context)
{
var action = context.Action.First().Value;
bool val= context.Principal.HasClaim(" ", action);
return val;
}
}
但是,当迁移到核心项目时,我收到此错误:
ID1061:HttpContext.Current 为空。此代码路径仅在以下情况下有效 在 ASP.NET 的执行上下文中。
在我的 EvaluateToken 方法中的这行代码:
SessionAuthenticationModule ssm = FederatedAuthentication.SessionAuthenticationModule;
我需要这条线才能工作,以便当我尝试访问具有自定义声明属性的操作方法时,我应该能够评估令牌中的声明是否存在。如果无法将其按原样移动到 aspnet 核心,那么我想知道如何在 aspnet 核心中使用令牌来授权访问仅具有传入令牌和受众、颁发者和密钥的特定视图用于生成令牌。该文档指定添加自定义策略,并且似乎采用了不同的路径。我不确定如何使用这种逻辑将声明存储在 UI 端的主体对象中,以便在 UI 端的视图之间移动时使用它。
这是我在配置方法中的 aspnet 核心 Web 项目上的 startup.cs 文件中的内容:
var issuer = "localhost";
var aud = "localhost";
var secret = "SecretValueHere";
var signingKey = new SymmetricSecurityKey(Encoding.ASCII.GetBytes(secret));
var jwtBearerOptions = new JwtBearerOptions
{
AutomaticAuthenticate = true,
AutomaticChallenge = true,
Audience = aud ,
ClaimsIssuer = issuer,
TokenValidationParameters = new TokenValidationParameters
{
ValidateIssuerSigningKey = true,
IssuerSigningKey = signingKey,
ValidateIssuer = true,
ValidIssuer = issuer,
ValidateAudience = true,
ValidAudience = aud ,
ValidateLifetime = true,
ClockSkew = TimeSpan.Zero,
RequireExpirationTime = true
}
};
app.UseJwtBearerAuthentication(jwtBearerOptions);
【问题讨论】:
标签: asp.net-mvc asp.net-core jwt claims-based-identity