我需要在api中创建和访问会话。例如,我有一个名为Login,Profile的api。那时调用登录api时,我需要创建会话,并且需要在配置文件api中访问该会话。清除会话后,登录和配置文件api不允许用户访问。怎么做。
谢谢..
答案 0 :(得分:1)
首先安装nuget软件包-Microsoft.AspNetCore.Session
在Startup.cs文件中
public void ConfigureServices(IServiceCollection services)
{
.....
services.AddSession(options => {
options.IdleTimeout = TimeSpan.FromMinutes(20);//You can set Time
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
});
.....
}
public void Configure(IApplicationBuilder app)
{
....
app.UseSession();
....
}
在HomeController文件中
using Microsoft.AspNetCore.Http;
public class HomeController : Controller
{
public ActionResult Index()
{
HttpContext.Session.SetString("key", "value"); // Set Session
var x = HttpContext.Session.GetString("key"); // Get Value of Session
}
}
您还可以在会话中设置整数值,使用SetInt32方法并从GetInt32方法获取。希望对您有帮助。
答案 1 :(得分:0)
在Startup.cs中,您可以通过添加以下行来添加cookie身份验证(您也可以指定会话时长等选项)。
services.AddAuthentication().AddCookie();
要从控制器创建登录会话,您可以调用此会话以具有一组声明(基本上是描述您需要了解的用户知识的键/值对)的用户身份登录:< / p>
await HttpContext.SignInAsync(userId, claims);
这将创建一个ClaimsPrincipal,可以通过Controller上的User属性进行访问:
User.HasClaim("someclaim", "somevalue")
最终,中间件将对声明进行加密并将其保存到cookie中,因此从服务器的角度来看,身份验证仍然是无状态的。请注意,尽管默认情况下使用的加密密钥与计算机绑定,所以如果计划扩展到多个服务器实例,则必须使用azure or redis之类的东西。
如果您想拥有完整的登录和用户管理系统,最简单的方法可能是ASP.net身份,它提供用于处理用户,策略,访问组以及一些棘手内容的API,例如使用实体框架。有关更多信息,请查看以下内容:https://docs.microsoft.com/en-us/aspnet/core/security/authentication/identity?view=aspnetcore-2.2&tabs=visual-studio
请注意,对于更通用的会话状态,this document包含有关其他会话状态选项的数据,但是由于您询问了登录信息,所以最好的选择可能是使用身份验证API。
答案 2 :(得分:0)
实际上,.net核心可以轻松访问会话。会话机制是aspnet的基本功能(以及.netcore) https://docs.microsoft.com/en-us/aspnet/core/fundamentals/app-state?view=aspnetcore-2.2
我认为您只需要添加
services.AddDistributedMemoryCache();
services.AddSession(options =>
{
// Set a short timeout for easy testing.
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
});
在ConfigureServices
中
和:
app.UseSession();
在Configure
然后,您可以在需要的地方注入ISession
来在任何地方使用它。由于这是按设计分配的,因此您应使用JsonConvert.SerializeObject
之类的序列化数据,然后反序列化它们。
此处描述的此功能与安全性概念无关。
答案 3 :(得分:0)
好的,您需要做两件事。在 startup.cs 中:
1-将 app.UseSession(); 添加到配置方法中。
2-要对Cookie进行更多控制,请在 ConfigureServices 方法中插入以下代码:
options.IdleTimeout = TimeSpan.FromSeconds(10);
options.Cookie.HttpOnly = true;
options.Cookie.IsEssential = true;
如能解决问题,就像这样。
答案 4 :(得分:-1)
我希望这是您正在寻找的解决方案
在startup.cs
在Configure方法中添加以下代码
app.UseSession();
在ConfigureServices方法中添加以下代码
services.AddDistributedMemoryCache();
services.AddSession(x=>
{
x.Cookie.Name = "Cookie name";
x.IdleTimeout = TimeSpan.FromMinutes(5); // idle time for the session
});
我在类文件示例UserLogin.cs中创建会话
private ISession session => httpContext.Session;
public UserLogin(HttpContext httpContext)
{
this.httpContext = httpContext;
}
private void SetSession(ClassInstance ObjOutput)
{
session.SetString("SessionID", ObjOutput.strSession.ToString());
}
在上面的代码中,我将HttpContext注入到类中,而strSession是GUID,我将从SP中获取它,
要在api中验证会话,请创建Action过滤器,在该过滤器中,您可以在OnActionExecuting(ActionExecutingContext context)方法的from上下文中获取会话
context.HttpContext.Request.Headers["Session"]; this line will get the session from header
context.HttpContext.Session.GetString("SessionID"); this line will get the current session
如果两者都匹配,就可以了
您可以使用以下代码告诉会话已过期
string strExceptionOutput = JsonConvert.SerializeObject(new response()
{
StatusCode = (int)HttpStatusCode.InternalServerError,
message = "Session Expired"
});
response.ContentType = "application/json";
context.Result = new BadRequestObjectResult(strExceptionOutput);