gpt4 book ai didi

asp.net-mvc - 使用 Web api cookie 作为 mvc cookie

转载 作者:行者123 更新时间:2023-12-02 02:33:32 25 4
gpt4 key购买 nike

我正在使用 Web API 2 和 MVC 5 制作 Web 应用程序。

我的应用程序有 api :api/account/login,用于检查发布的信息,并在授予帐户访问应用程序时抛出状态200。

此外,我有一个 View :/Home/Index,该 View 仅适用于经过身份验证的客户端。

现在,我的方法是:

  • 调用 api/account/login,接收该 api 抛出的 cookie。
  • 将抛出的 cookie 附加到浏览器。
  • 当用户访问/Home/Index 时,他/她可以查看。

我的问题是:

- 我的方法可行吗?

- 如何在 Web API 2 中加密我的 cookie,就像 MVC 5 对其 cookie 所做的那样?

谢谢,

最佳答案

实现此目的的最佳方法是在 MVC 项目中拥有授权服务器(生成 token 的 WebAPI)和 token 消耗中间件。IdentityServer https://github.com/IdentityServer/IdentityServer3应该有帮助。不过我已经这样做了,如下

使用带有 WEB API 和 ASP.Net Identity 的 JWT 构建授权服务器,如此处所述 http://bitoftech.net/2015/02/16/implement-oauth-json-web-tokens-authentication-in-asp-net-web-api-and-identity-2/

一旦你这样做了,你的 webAPIstartup.cs 将如下所示

/// Configures cookie auth for web apps and JWT for SPA,Mobile apps
private void ConfigureOAuthTokenGeneration(IAppBuilder app)
{
// Configure the db context, user manager and role manager to use a single instance per request
app.CreatePerOwinContext(ApplicationDbContext.Create);
app.CreatePerOwinContext<ApplicationUserManager>(ApplicationUserManager.Create);
app.CreatePerOwinContext<ApplicationRoleManager>(ApplicationRoleManager.Create);

//Cookie for old school MVC application
var cookieOptions = new CookieAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Active,
CookieHttpOnly = true, // JavaScript should use the Bearer
AuthenticationType = DefaultAuthenticationTypes.ApplicationCookie,
LoginPath = new PathString("/api/Account/Login"),
CookieName = "AuthCookie"
};
// Plugin the OAuth bearer JSON Web Token tokens generation and Consumption will be here
app.UseCookieAuthentication(new CookieAuthenticationOptions());

OAuthServerOptions = new OAuthAuthorizationServerOptions()
{
//For Dev enviroment only (on production should be AllowInsecureHttp = false)
AllowInsecureHttp = true,
TokenEndpointPath = new PathString("/oauth/token"),
AccessTokenExpireTimeSpan = TimeSpan.FromDays(30),
Provider = new CustomOAuthProvider(),
AccessTokenFormat = new CustomJwtFormat(ConfigurationManager.AppSettings["JWTPath"])
};

// OAuth 2.0 Bearer Access Token Generation
app.UseOAuthAuthorizationServer(OAuthServerOptions);

}

您可以在此处找到 CustomOAuthProvider、CustomJwtFormat 类 https://github.com/tjoudeh/AspNetIdentity.WebApi/tree/master/AspNetIdentity.WebApi/Providers

在您想要使用相同 token 保护的所有其他 API(资源服务器)中编写消费逻辑(即中间件)。由于您想在 MVC 项目中使用 webAPI 生成的 token ,因此在实现授权服务器后,您需要执行以下操作

在您的 MVC 应用程序中,在startup.cs 中添加以下内容

public void Configuration(IAppBuilder app)
{
ConfigureOAuthTokenConsumption(app);
}

private void ConfigureOAuthTokenConsumption(IAppBuilder app)
{
var issuer = ConfigurationManager.AppSettings["AuthIssuer"];
string audienceid = ConfigurationManager.AppSettings["AudienceId"];
byte[] audiencesecret = TextEncodings.Base64Url.Decode(ConfigurationManager.AppSettings["AudienceSecret"]);

app.UseCookieAuthentication(new CookieAuthenticationOptions { CookieName = "AuthCookie" , AuthenticationType=DefaultAuthenticationTypes.ApplicationCookie });

//// Api controllers with an [Authorize] attribute will be validated with JWT
app.UseJwtBearerAuthentication(
new JwtBearerAuthenticationOptions
{
AuthenticationMode = AuthenticationMode.Passive,
AuthenticationType = "JWT",
AllowedAudiences = new[] { audienceid },
IssuerSecurityTokenProviders = new IIssuerSecurityTokenProvider[]
{
new SymmetricKeyIssuerSecurityTokenProvider(issuer, audiencesecret)
}

});
}

在您的 MVC Controller 中,当您收到 token 时,将其反序列化并从访问 token 生成 cookie

        AccessClaims claimsToken = new AccessClaims();
claimsToken = JsonConvert.DeserializeObject<AccessClaims>(response.Content);
claimsToken.Cookie = response.Cookies[0].Value;
Request.Headers.Add("Authorization", "bearer " + claimsToken.access_token);
var ctx = Request.GetOwinContext();
var authenticateResult = await ctx.Authentication.AuthenticateAsync("JWT");
ctx.Authentication.SignOut("JWT");
var applicationCookieIdentity = new ClaimsIdentity(authenticateResult.Identity.Claims, DefaultAuthenticationTypes.ApplicationCookie);
ctx.Authentication.SignIn(applicationCookieIdentity);

生成机器 key 并将其添加到 webAPI 和 ASP.Net MVC 站点的 web.config 中。

这样,将创建一个 cookie,并且 MVC 站点和 WebAPI 中的 [Authorize] 属性将尊重此 cookie。

附注- 我已经使用发布 JWT(授权服务器或身份验证和资源服务器)的 Web API 完成了此操作,并成功地能够在 ASP.Net MVC 网站、Angular 中构建的 SPA 网站、python(资源服务器)中构建的安全 API、spring 中使用(资源服务器),Android应用程序。

关于asp.net-mvc - 使用 Web api cookie 作为 mvc cookie,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38424518/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com