在本文中,您将会了解到关于C#EF核心WebApi扩展在实体上为空的新资讯,并给出一些关于.net核心webapi启动时如何预加载数据?、.NET核心Web应用程序的基于APIGEE和AUTHSys的
在本文中,您将会了解到关于C#EF核心Web Api扩展在实体上为空的新资讯,并给出一些关于.net核心webapi启动时如何预加载数据?、.NET核心Web应用程序的基于APIGEE和AUTH Sys的单点登录(SSO)、ASP.Net web api Vs .Net核心web api、Asp.net 核心 Web api - 当 Web api 针对 Azure AD 验证 JWT 令牌时,幕后会发生什么的实用技巧。
本文目录一览:- C#EF核心Web Api扩展在实体上为空
- .net核心webapi启动时如何预加载数据?
- .NET核心Web应用程序的基于APIGEE和AUTH Sys的单点登录(SSO)
- ASP.Net web api Vs .Net核心web api
- Asp.net 核心 Web api - 当 Web api 针对 Azure AD 验证 JWT 令牌时,幕后会发生什么
C#EF核心Web Api扩展在实体上为空
如何解决C#EF核心Web Api扩展在实体上为空?
我在我的Web api项目中使用了net core 3.1框架。我的问题是,我有一个没有数据库上下文的实体(“ FirebaseUser”)。但是,此实体与具有数据库上下文的实体(“ Mitarbeiter”)具有一对一关系。然后,将“ FirebaseUser”实体扩展为“ Mitarbeiter”实体,属性“ Mitarbeiter”为空。 不执行用于选择“ Mitarbeiter”的sql语句。我想是因为我要返回一个没有数据库上下文的实体。有人有想法吗?
FirebaseUser实体声明:
[NotMapped]
[FirestoreData]
public class FirebaseUser : FirestoreObject
{
[FirestoreProperty]
public string sUid { get; set; }
[FirestoreProperty]
public string sEmail { get; set; }
[FirestoreProperty]
public bool? bAlwaysMustLogin { get; set; }
[FirestoreProperty(ConverterType = typeof(GuidConverter))]
public Guid? sMitarbeiterId { get; set; }
[FirestoreProperty]
public bool? bDeleted { get; set; }
public string sPasswort { get; set; }
[ForeignKey("sMitarbeiterId")]
public virtual Mitarbeiter Mitarbeiter { get; set; }
}
FirebaseUser控制器代码
[EnableQuery]
public async Task<IActionResult> Get([FromODataUri] string key)
{
Environment.SetEnvironmentvariable("GOOGLE_APPLICATION_CREDENTIALS",FirestoreObject.CredentialPath);
FirestoreDb oDb = FirestoreDb.Create(FirestoreObject.FirestoreDb);
DocumentSnapshot oBenutzerSnapshot = await oDb.Collection("benutzer_benu").Document(key).GetSnapshotAsync();
if (!oBenutzerSnapshot.Exists)
{
return NotFound();
}
FirebaseUser oUser = oBenutzerSnapshot.ConvertTo<FirebaseUser>();
return Ok(oUser);
}
结果看起来像这样 (“ / FirebaseUser?$ expand = Mitarbeiter”)
{
"@odata.context": "http://localhost:52854/$Metadata#FirebaseUser(Mitarbeiter())/$entity","sUid": "2BYJSDtifrV14yuw06XDSvrlz363","sEmail": "werner-eder@t-online.de","bAlwaysMustLogin": null,"sMitarbeiterId": null,"bDeleted": false,"sPasswort": null,"sId": "7uIDmH8QHRqbONZaoA8o","sAngelegtVonUid": null,"dAngelegtAm": null,"Mitarbeiter": null
}
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
.net核心webapi启动时如何预加载数据?
大约有90万条数据库记录用于某种计算,所以我想在webapi启动时填充一个数据表,并且该数据表可以由某些控制器和方法使用。
如果数据库查询和计算需要很长时间才能完成,则可以尝试使用后台任务逻辑实现hosted service,并在redis中缓存计算结果等。然后,您就可以从redis中获取缓存的数据了。控制器和方法。
此外,如果查询和计算逻辑不是很复杂,则可以尝试创建并实现用于查询数据库和进行计算的自定义服务,然后register your service在控制器中使用它。
.NET核心Web应用程序的基于APIGEE和AUTH Sys的单点登录(SSO)
如何解决.NET核心Web应用程序的基于APIGEE和AUTH Sys的单点登录(SSO)?
我在Azure应用服务中托管了一个.net核心Web应用。有什么方法可以使用APIGEE和AUTH Sys管理单一登录(SSO)?
如果是,该如何实现?任何循序渐进的教程或链接都会有所帮助。
谢谢。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)
ASP.Net web api Vs .Net核心web api
是.Net核心Web Api快吗?是的如何?
解决方法
但我会说ASP.NET Core堆栈比旧的ASP.NET / WebAPI堆栈更快.
ASP.NET Core更快的原因有多种:
>它是为高性能,可扩展(云)方案构建的>不依赖于旧的System.Web.dll>更精简的执行中间件管道(Owin)
Asp.net 核心 Web api - 当 Web api 针对 Azure AD 验证 JWT 令牌时,幕后会发生什么
我假设您对 OIDC 流程和索赔类型有所了解。
Azure AD 发现文档位于固定位置,如果您拥有租户 ID (https://login.microsoftonline.com/{tenantId|'common'}/v2.0/.well-known/openid-configuration),则该文档是已知的。这与客户端 ID 相结合是完成隐式身份验证流程所需的全部内容。
一旦请求具有带有 Bearer 架构的授权标头,中间件就会开始解码令牌。在令牌的标头中,散列和签名的类型与使用的密钥 ID 一起注明。在正文中,您将拥有这些声明。如果提供的声明有效,则中间件将执行此操作。它至少检查:
- 如果授权声明与发现文档中定义的发布者匹配。
- 通过使用当前时间验证 not before 和 valid until 声明,声明仍然有效
- 颁发者应与配置的客户端 ID 匹配。
然后它将使用令牌头部中指定的哈希算法,对头部和主体进行哈希处理。使用标题中的密钥 ID,它将查找发现文档发布的公钥(jwks_url 将列出所有已知的公钥)。要加密哈希,该结果应与由该密钥的私有部分创建的所提供令牌的页脚签名相匹配。
如果所有这些都是有效的,那么中间件将使用此令牌的列表向声明主体添加一个身份,并将其标记为已验证。它不会在应用程序中做任何授权。这由应用程序中的下一层处理。
如果令牌无效,可能是过期、错误的权限或错误的签名。中间件不会抛出错误。它只是没有在主体中注册声明,并且用户保持匿名。
这是一个粗略的解释,对于任何 JWT 不记名身份验证背景中发生的情况,可能不是 100% 准确。 Azure AD 将遵循相同的流程,只是配置细节略有不同。
,我认为您需要在 Azure 中注册两个应用程序,一个代表 client application,另一个代表 web api application(即服务器应用程序)。然后使用用户登录客户端应用程序完成授权并获取访问令牌,然后客户端应用程序使用访问令牌调用api应用程序。
大致流程如下:web api收到访问令牌时,首先需要过滤器拦截令牌,然后解析令牌并验证令牌中的一些关键声明,例如:aud
, sub
,scp
... 验证令牌中的声明后,后端应用程序将资源返回给前端。
过滤案例:
package com.example.demo;
import java.io.IOException;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.alibaba.fastjson.JSONObject;
import com.auth0.jwt.JWT;
import com.auth0.jwt.exceptions.JWTDecodeException;
import com.auth0.jwt.interfaces.Claim;
import com.auth0.jwt.interfaces.DecodedJWT;
//@Component
@WebFilter(filterName = "AdHelloFilter",urlPatterns = {"/ad/*"})
public class AdHelloFilter implements Filter {
@Override
public void doFilter(ServletRequest request,ServletResponse response,FilterChain filterChain)
throws IOException,ServletException {
HttpServletRequest httpRequest = (HttpServletRequest) request;
HttpServletResponse httpResponse= (HttpServletResponse) response;
final String requestTokenHeader = httpRequest.getHeader("Authorization");
if (requestTokenHeader != null && requestTokenHeader.startsWith("Bearer ")) {
String jwtToken = requestTokenHeader.substring(7);
try {
DecodedJWT jwt = JWT.decode(jwtToken);
//judge if expired
Date expiresAt = jwt.getExpiresAt();
if(expiresAt.before(new Date())) {
Map<String,Object> errRes = new HashMap<String,Object>();
Map<String,Object> errMesg = new HashMap<String,Object>();
errMesg.put("code","InvalidAuthenticationToken");
errMesg.put("message","Access token has expired.");
errRes.put("error",errMesg);
String json = JSONObject.toJSONString(errRes);
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED,json);
return;
}
//judge if has specific scope
Claim a = jwt.getClaim("scp");
String scope = a.asString();
String[] scopeArr = scope.split(" ");
List<String> scopeList= Arrays.asList(scopeArr);
if(!(scopeList.contains("User.Read") && scopeList.contains("Mail.Read"))) {
Map<String,"Unauthorized,pls add api permission");
errRes.put("error",errMesg);
String json = JSONObject.toJSONString(errRes);
httpResponse.sendError(HttpServletResponse.SC_FORBIDDEN,json);
return;
}
} catch (JWTDecodeException exception){
System.out.println("Unable to Decode the JWT Token");
}
} else {
httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED);
return;
}
filterChain.doFilter(request,response);
}
@Override
public void init (FilterConfig filterConfig) throws ServletException{
System.out.println("init filter");
}
@Override
public void destroy() {}
}
查看一个简单的 sample。
关于C#EF核心Web Api扩展在实体上为空的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于.net核心webapi启动时如何预加载数据?、.NET核心Web应用程序的基于APIGEE和AUTH Sys的单点登录(SSO)、ASP.Net web api Vs .Net核心web api、Asp.net 核心 Web api - 当 Web api 针对 Azure AD 验证 JWT 令牌时,幕后会发生什么等相关知识的信息别忘了在本站进行查找喔。
本文标签: