如何创建和访问会话.net核心api?

时间:2019-02-25 14:18:24

标签: asp.net-core .net-core asp.net-core-webapi asp.net-core-2.1

我需要在api中创建和访问会话。例如,我有一个名为Login,Profile的api。那时调用登录api时,我需要创建会话,并且需要在配置文件api中访问该会话。清除会话后,登录和配置文件api不允许用户访问。怎么做。

谢谢..

5 个答案:

答案 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);