标签: asp.net-authorization

保护整个ASP.NET 5 MVC 6应用程序

如果我想保护我的MVC应用程序中的特定部分,我将使用[Authorize]ActionMethod.我也知道我可以将它用于整个控制器,这样我就不必为其中的每个ActionMethod指定它.

我想在全球范围内要求授权,并且希望能够仅在少数几个地方允许匿名用户.如何要求用户在全球范围内获得授权,并允许匿名用户使用一些ActionMethods?

asp.net-authorization asp.net-identity asp.net-core-mvc asp.net-core

7
推荐指数
1
解决办法
404
查看次数

MVC POST请求丢失授权标头 - 如何在检索后使用API​​承载标记

我花了最后一周为现有的MVC应用程序创建API,现在我正在尝试保护API以及根据需要重新修改MVC端安全性.

目前,MVC应用程序设置为通过OWIN/OAuth/Identity使用应用程序cookie.我试图合并设置Web API的Bearer令牌,以便在调用受限API方法时生成,但到目前为止收效甚微 - GET请求工作正常,但POST请求在收到时失去了Authorization标头. API.

我已经创建了一个SDK客户端,MVC应用程序正在使用它来调用API,并尝试了三种为API的任何给定调用设置Authorization标头的方法,所有这些方法似乎都能正常工作对于GET请求很好,但是对于我需要做的任何POST请求完全失败...

我可以在MVC控制器中设置Request标头:

HttpContext.Request.Headers.Add("授权","承载"+ response.AccessToken);

(其中response.AccessToken是先前从API检索的令牌)
我可以通过SDK客户端上的扩展方法设置Request头:

_apiclient.SetBearerAuthentication(token.AccessToken)

或者我可以在SDK客户端上手动设置Request标头:

_apiClient.Authentication = new AuthenticationHeaderValue("Bearer,accessToken);

(其中accessToken是先前检索的令牌,传递给被调用的Client方法).

从这一点来看,我几乎没有什么可以解决导致这个问题的原因.到目前为止,我唯一能够收集的是ASP.NET导致所有POST请求首先发送请求,并带有Expect标头,用于HTTP 100-Continue响应,之后它将完成实际的POST请求.但是,似乎当它执行第二次请求时,Authorization标头不再存在,因此API的Authorize属性将导致401-Unauthorized响应,而不是实际运行API方法.

那么,我如何获取能够从API检索的Bearer令牌,并在后续请求中使用它,包括我需要做的各种POST请求?

除此之外,将此令牌存储在MVC应用程序本身的最佳方法是什么?我宁愿避免将字符串传递给应用程序中可能需要它的每个方法,但我也一直在阅读,出于安全原因将其存储在cookie中是一个非常糟糕的主意.

在我通过这个问题后,我会立即感兴趣的几点:

使用OAuth Bearer Tokens是否意味着我不能再将ApplicationCookies用于MVC应用程序?和/或它会在整个应用程序中使以下代码无用吗?

User.Identity.GetUserId()

目前我被迫评论我的API [授权]属性以继续我的工作,这显然不是理想的但它确实允许我暂时继续处理.

启动文件:

MVC:

public class Startup
{
    public void Configuration(IAppBuilder app)
    {
        ConfigureAuth(app);
    }

    private void ConfigureAuth(IAppBuilder app)
    {
        app.CreatePerOwinContext(ADUIdentityDbContext.Create);
        app.CreatePerOwinContext<ADUUserManager>(ADUUserManager.Create);

        app.UseOAuthBearerTokens(new OAuthAuthorizationServerOptions
                                 {
                                     AccessTokenExpireTimeSpan = TimeSpan.FromDays(1),
                                     //This should be set to FALSE before we move to production.
                                     AllowInsecureHttp =  true,
                                     ApplicationCanDisplayErrors = true,
                                     TokenEndpointPath = new PathString("/api/token"),

                                 }); …
Run Code Online (Sandbox Code Playgroud)

post asp.net-authorization oauth-2.0 asp.net-mvc-5 asp.net-web-api2

7
推荐指数
1
解决办法
3293
查看次数

如何在Asp.Net Core自定义授权筛选器中返回未授权

我有一个用于API的自定义授权过滤器,该过滤器会检查保存在数据库中的令牌。

像这样

override public void OnAuthorization(AuthorizationContext context)
    {
        if (!context.HttpContext.Request.Headers.Keys.Contains("X-CustomToken"))
        {
            context.HttpContext.Response.StatusCode = 401; //Unauthorized
            return;
        }

        var headerToken = context.HttpContext.Request.Headers
                         .Where(a => a.Key.ToLower() == "x-customtoken").FirstOrDefault();
        var company= _repository.GetCompanyByToken(headerToken.Value);
        if (company == null)
        {
            context.Result = new HttpStatusCodeResult(401);
            return;
        }

        _myFactory.SetCurrentCompany(company);            
    }
Run Code Online (Sandbox Code Playgroud)

问题是,正如我在此处询问的其他问题中所读到的一样,它被重定向到登录页面,就像对前端控制器一样。我通常阅读的解决方案是完全覆盖此行为。但是,我的项目在同一解决方案中有一个前端和一个API,因此仅在使用我的自定义属性时才需要覆盖它。

谢谢

c# asp.net-authorization asp.net-core

6
推荐指数
0
解决办法
4099
查看次数

如何在 asp.net 4.5 和 asp.net core 之间共享加密的 cookie?

我们很少有 ASP.NET 4.5 应用程序共享由 Web 配置机器密钥保护的身份验证 cookie (SSO) ,我不会更改它们。

ASP.NET 4.5 登录:

    var auth = FederatedAuthentication.SessionAuthenticationModule;
 auth.WriteSessionTokenToCookie(new System.IdentityModel.Tokens.SessionSecurityToken(cp));
Run Code Online (Sandbox Code Playgroud)

现在我们即将在同一个域中实现新的 ASP.NET 核心应用程序,我们希望保留旧的 cookie 授权机制。联合身份验证在 CORE 的运行时失败,是否有任何线索可以解密来自同一域的旧 cookie 并与 asp.net 和 asp.net core 共享新的 cookie?

ASP.NET 核心设置:

    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });

        services.AddMvc()
            .AddRazorPagesOptions(options =>
            {
                options.Conventions.AuthorizePage("/Contact");
            })
            .SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

        #region snippet1
        services.AddAuthentication(CookieAuthenticationDefaults.AuthenticationScheme)
            .AddCookie();
        #endregion

        services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
    }

    public void Configure(IApplicationBuilder app, IHostingEnvironment env)
    {
        if (env.IsDevelopment())
        { …
Run Code Online (Sandbox Code Playgroud)

c# asp.net asp.net-authorization asp.net-core

6
推荐指数
0
解决办法
901
查看次数

无需 Windows 身份验证即可获取用户的 Windows 用户名

我们有一个面向内部的(C#/MVC/IIS7)应用程序,其要求用户不必输入凭据,但我们需要网络/Windows 用户名来识别当前用户是谁。

有什么办法可以做到这一点吗?谢谢!

c# asp.net-mvc iis-7 windows-authentication asp.net-authorization

5
推荐指数
1
解决办法
6236
查看次数

使用 ASP.NET Core 2.0 进行用户管理

也许我错过了一些东西,但是,我阅读了大量关于使用 .NET Core 2.0 进行身份验证和授权的文档和文章,但我没有找到任何关于用户管理的内容。

我想要实现的是拥有一个管理员用户界面,可以创建用户、列出所有现有用户并将他们分配给预定义的角色和/或预定义的策略。

我尝试这样做但没有成功(我在尝试使用模型时遇到问题,例如IEnumerable<IdentityUser>关于无效构造函数:

InvalidOperationException:找不到适合类型“System.Collections.Generic.IEnumerable`1[Microsoft.AspNetCore.Identity.IdentityUser]”的构造函数。确保类型是具体的,并且为公共构造函数的所有参数注册了服务。

我无法RoleManager在任何控制器中获取。它适用于 UserManager,但不适用于 RoleManager。我加了

        services.AddIdentity<ApplicationUser, IdentityRole>()
            .AddEntityFrameworkStores<ApplicationDbContext>()
            .AddDefaultTokenProviders();
Run Code Online (Sandbox Code Playgroud)

到启动,所以我教它会自动注入 DI ......

ApplicationUser 定义如下:

namespace KaraokeServices.Data
{
    public class ApplicationUser : IdentityUser
    {
    }
}
Run Code Online (Sandbox Code Playgroud)

我定义了一个 UserController 如:

namespace KaraokeServices.Controllers
{
    [Route("[controller]/[action]")]
    public class UserController : Controller
    {
        private readonly UserManager<ApplicationUser> userManager;

        public UserController(ApplicationDbContext pContext,  SignInManager<ApplicationUser> pSignInManager, ILogger<AccountController> logger)
        {
            userManager = pSignInManager.UserManager;
        }

        [HttpGet]
        public IActionResult Index()
        {
            List<ApplicationUser> users = new List<ApplicationUser>();

            users = userManager.Users.ToList();

            return View(users);
        } …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-authorization .net-core

5
推荐指数
1
解决办法
2040
查看次数

asp net core中services.AddAuthentication()和services.AddAuthorization()有什么区别?

我有以下代码,我想了解这两种扩展方法之间有什么区别。每一个人都做什么?

services.AddAuthentication (JwtBearerDefaults.AuthenticationScheme)
            .AddJwtBearer (options => options.TokenValidationParameters = new TokenValidationParameters {
                ValidateIssuer = true,
                    ValidateAudience = true,
                    ValidateLifetime = true,
                    ValidateIssuerSigningKey = true,
                    ClockSkew = TimeSpan.Zero,
                    ValidIssuer = Issuer,
                    ValidAudience = Audience,
                    IssuerSigningKey = new SymmetricSecurityKey(secret)
            });

            services.AddAuthorization();
Run Code Online (Sandbox Code Playgroud)

谢谢,

c# asp.net-authorization asp.net-authentication jwt asp.net-core

5
推荐指数
1
解决办法
2万
查看次数

SignalR AccessTokenProvider 适用于 TypeScript 客户端,但不适用于 .NET 客户端

HubConnection我正在尝试通过C# .NET 客户端中的a 传递 access_token 。但是,结果与我通过 TypeScript 客户端看到的结果不一致。这种不一致会导致 C# .NET 客户端中的授权失败,但 TypeScript 客户端中的授权成功。

这是相关代码:

打字稿

var builder = new signalr.HubConnectionBuilder();
builder.withUrl(hubUrl, {accessTokenFactory: () => token});
Run Code Online (Sandbox Code Playgroud)

C#

var builder = new HubConnectionBuilder();
builder.WithUrl(url, o => {
  o.AccessTokenProvider = () => Task.FromResult(_token);
  //I've tried the following as well
  //o.Headers.Add("Authorization", "Bearer " + _token);
});
Run Code Online (Sandbox Code Playgroud)

TypeScript 代码生成一个 HTTP 请求,如下所示:

POST http://localhost:5000/machine/negotiate?negotiateVersion=1 HTTP/1.1
Host: localhost:5000
Connection: keep-alive
Content-Length: 0
Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoidGVzdCIsImh0dHA6Ly9zY2hlbWFzLm1pY3Jvc29mdC5jb20vd3MvMjAwOC8wNi9pZGVudGl0eS9jbGFpbXMvcm9sZSI6IkFkbWluaXN0cmF0b3IiLCJleHAiOjE1NzYxODYwMTYsImlzcyI6Im5TY3J5cHQsIEluYy4iLCJhdWQiOiJuU3R1ZGlvIFVzZXIifQ.qxAzu-NgzlnfCqyysiML4Z0_s6UBTeRb7wcuGno9rk4
X-Requested-With: XMLHttpRequest
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-authorization jwt signalr typescript

5
推荐指数
1
解决办法
4999
查看次数

资源列表的基于资源的授权?

如何实现资源列表的授权?

我看到的所有文档都基于 IAuthorizationService 和 AuthorizeAsync 方法。但这仅适用于一种资源。

我是否应该检索所有资源,然后使用 IAuthorizationService 的 AuthorizeAsync 方法强制检查用户是否有权访问?这看起来非常笨拙、缓慢且低效。

你会怎么做?

asp.net-authorization .net-core asp.net-core asp.net-core-webapi

5
推荐指数
1
解决办法
610
查看次数

从 ASP.NET Core 3.1 升级到 ASP.NET 5.0 后,User.Claims 为空

从 ASP.NET Core 3.1 升级到版本 5 后,context.User.Claims为空

protected override Task HandleRequirementAsync(AuthorizationHandlerContext context, MyRequirement requirement)
Run Code Online (Sandbox Code Playgroud)

public class MyRequirementHandler : AuthorizationHandler<MyRequirement>
Run Code Online (Sandbox Code Playgroud)

我将Authorization标头与 JWT 的不记名令牌一起使用。在查看时我可以看到标头设置正确HttpContext.Request.Headers,但它似乎没有被解析。

这是在具有该属性的 Grpc 服务上设置的[Authorize]

使用 ASP.NET Core 3.1,它运行得很好。我阅读了官方迁移指南,但他们有关授权的参考仅适用于 Azure Active Directory。

我正在使用 IdentityServer4,它托管在 ASP.NET Core 应用程序中作为中间件 ( app.UseIdentityServer();)

我忘记修改什么以使 ASP.NET Core 正确解析授权标头?

更新:

我更详细地检查了它,发现它失败了,因为它无法验证受众 ( aud) - 是的,在新创建的代币上,受众缺失(旧代币有受众)。我还注意到我添加了一个自定义范围

public override async Task GetProfileDataAsync(ProfileDataRequestContext context)
Run Code Online (Sandbox Code Playgroud)

在我的习惯里面

public class ProfileService : ProfileService<ApplicationUser>
Run Code Online (Sandbox Code Playgroud)

更新后也不见了。IdentityServer 的配置方式如下:

protected override Task HandleRequirementAsync(AuthorizationHandlerContext …
Run Code Online (Sandbox Code Playgroud)

asp.net-authorization jwt asp.net-core identityserver4 asp.net-core-5.0

5
推荐指数
1
解决办法
3552
查看次数